Android Dev / / 2020. 1. 28. 01:26

Firebase's Timestamp/Fieldvalue/Date/String 관련 변환(2023.12.18 추가)

0. DataClass에서 Firebase  timeStamp를 Date로 변환하는 방

@ServerTimestamp @Serializable(with = DateSerializer::class) var login_time : Date? = Date(0), //# 로그인 타임 체크 추가

위와 같이 Date? 타입으로 설정하면 timeStamp가 자동으로 Date로 변환된다. 그래서 : 

userPublic = userBasic.toObject(UserPublicInfo::class.java)!!

위와 같은 형식으로 불러오는게 가능하다. (@ServerTimeStamp 애노테이션을 안붙이면 TimeStamp에서 Date로 변환하기 어렵다)

 

1. 오늘의 날짜 호출

 

-한국 기준 타임 호출

ZonedDateTime.now(ZoneId.of("Asia/Seoul")).format(DateTimeFormatter.ofPattern("YYYY MM dd일 현재"))

 

val postingTime = (temporRepository["time"] as Timestamp).toDate()
val postingTimeTransed =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val posting_time_localDateTime = LocalDateTime.ofInstant(postingTime.toInstant(), ZoneId.of("Asia/Seoul"))
DateTimeFormatter.ofPattern("HH:mm:ss 작성").format(posting_time_localDateTime)
} else {
val formatter = SimpleDateFormat("HH:mm:ss 에 작성")
formatter.format(postingTime)
}
val todayDate = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val postingTimeLocalDateTime = LocalDateTime.ofInstant(Date().toInstant(), ZoneId.systemDefault())
DateTimeFormatter.ofPattern("YYYYMMdd").format(postingTimeLocalDateTime)
} else {
val formatter = SimpleDateFormat("YYYYMMdd", Locale.KOREA)
formatter.timeZone = TimeZone.getTimeZone("Asia/Seoul")
formatter.format(Date())
}

 

 

0. 파베에서 온 Timestamp데이터를 String 포맷으로 변환하는 방법

val posting_time = (tempor_repository["comment_date"] as Timestamp).toDate()
val postingTimeTransed = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val posting_time_localDateTime = LocalDateTime.ofInstant(posting_time.toInstant(), ZoneId.systemDefault())
DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss").format(posting_time_localDateTime)
} else {
val formatter = SimpleDateFormat("YYYY-MM dd-HH:mm:ss")
formatter.format(posting_time)
}

 

 

1. 파베에서 온 데이터를 뮤타블 맵으로 변환하는 방법

var postingContext_mutableMap : MutableMap<String,Any> = mutableMapOf()
map_gps_posting_marker[it.tag]?.forEach { it ->
postingContext_mutableMap[it.key] = it.value
}

 

2. Mutable Map에 Any형식으로 존재하는 time 정보를 Timestamp로 받은뒤 Date() 형식으로 변환하는 방법

val posting_time = (contents["posting_time"] as Timestamp).toDate()

 

3. 현재 Date를 활용하여 String형식의 데이터를 만드는 방법

<예시 1번>

val randomTail = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
LocalDateTime.now().format(DateTimeFormatter.ofPattern("YYMMddHHmmss"))
} else {
val date = Date()
val formatter = SimpleDateFormat("YYMMddHHmmss")
formatter.format(date)
}

 

<예시 2번>

val postingTimeTransed = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val posting_time_localDateTime = LocalDateTime.ofInstant(posting_time.toInstant(), ZoneId.systemDefault())
DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss").format(posting_time_localDateTime)
} else {
val formatter = SimpleDateFormat("YYYY-MM dd-HH:mm:ss")
formatter.format(posting_time)
}
m21_tv_guestbook_bottomsheet_date.text = postingTimeTransed

 

<예시 3번>

val posting_time = (tempor_repository["posting_time"] as Timestamp).toDate()
val postingTimeTransed = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val posting_time_localDateTime = LocalDateTime.ofInstant(posting_time.toInstant(), ZoneId.systemDefault())
DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss").format(posting_time_localDateTime)
} else {
val formatter = SimpleDateFormat("YYYY-MM dd-HH:mm:ss")
formatter.format(posting_time)
}

 

4. FieldValue로 Firebase의 서버시간을 사용하는 방법

/**시간정보를 추가*/
postcontext.posting_time = FieldValue.serverTimestamp()

 


5. timezone 변경하는 방법

val nowInParis = ZonedDateTime.now(ZoneId.of("Europe/Paris"))

 

 

6. timezone 변경하는 방법2

val date = Date()
var formatter = SimpleDateFormat("YYMMddHHmmss")
formatter.timeZone = TimeZone.getTimeZone("Asia/Seoul")
println("timezone : " +formatter.format(date))
formatter.timeZone = TimeZone.getTimeZone("Europe/Paris")
println("timezone : " +formatter.format(date))



var formatter = SimpleDateFormat("YYMMddHHmmss")
formatter.timeZone = TimeZone.getTimeZone("Asia/Seoul")
formatter.format(Date())

 

 

 

fun nowDateStringFirebase(observer:(Date) -> Unit){
    val messages = hashMapOf<String, Any?>()
    messages["currentTime"] = FieldValue.serverTimestamp()
    val storeRef = FirebaseFirestore.getInstance().collection("timechecker").document("time")
    storeRef.set(messages, SetOptions.merge()).addOnSuccessListener {
        storeRef.get().addOnSuccessListener {
            observer((it["currentTime"] as Timestamp).toDate())
        }
            .addOnFailureListener {
                // println(it)
                //   Log.e("임시에러체크2 : ", it.toString())
            }
    }
        .addOnFailureListener {
            //  println(it)
            // Log.e("임시에러체크 : ", it.toString())
        }
}

 

FieldValue.serverTimestamp() 를 등록

파이어베이스 타임을 시간변환 it["currentTime"] as Timestamp).toDate()

 

기본적인 파이어베이스 Timestamp는 아래와 같고 이를 String으로 저장하면 아래 문자 그대로 긴 문자열이 저장된다

이를 Date 메소드를 활용해서 Long type변수로 변형해서 쓰면 적은 문자열로 저장할 수 있다

이를 변형하여 저장하는 예시는 아래와 같다

Java Date로 변환
Long time으로 변환
변환된 Long time을 java.Date로 재변환.
위에서 변환된 Date를 Firebase.Timestamp로 재변환

 

2. Firebase Date query 작성

1. 현재 날짜 기준으로 3일까지의 documents를 쿼리하려고 할 경우.

timeStamp가 존재하는(field : date) 문서

 

위와 같은 경우에 기존 3일 정도의 문서만을 받아오고자 할때는 아래와 같이 쿼리문을 작성한다.

 

firebase.collection("bulletinBoard")?.whereLessThan("date", Date(Date().time + 3*86400_000))?.addSnapshotListener { snapshot, _ -> ... }

1> 여기서 Date()는 현재 시간이고, 이를 .time를 호출하여 Unix 시간대로 Long 변환한다. 여기서 +1 하면 1milisecond, +1000를 하면 1second가 추가되는 것이므로, 하루를 밀리세컨드로 계산한 86400_000를 더해주면, 현재 기준 + 1일의 시간대로 만들 수 있다. 

2> whereLessThan을 호출하여 conditioned querying을 할 수 있다. 아래 이미지를 참고하라.

 

whereLessThan 동작

 

 

위 코드에 대한 쿼리 동작

 

 

 

Simple Date Formatting 모음

 

SimpleDateFormat("aa hh시 mm분", Locale.KOREA).format(it)  => 오전/오후 => aa

SimpleDateFormat("E", Locale.KOREA) => 요일 표시

 

val dateToString = gatheringTime?.let { SimpleDateFormat("MM월 dd일 (E) aa hh:mm", Locale.KOREA).format(it) }

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유