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변수로 변형해서 쓰면 적은 문자열로 저장할 수 있다
이를 변형하여 저장하는 예시는 아래와 같다
2. Firebase Date query 작성
1. 현재 날짜 기준으로 3일까지의 documents를 쿼리하려고 할 경우.
위와 같은 경우에 기존 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을 할 수 있다. 아래 이미지를 참고하라.
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) }
'Android Dev' 카테고리의 다른 글
dialogFragment RX Response 예제 (0) | 2020.06.14 |
---|---|
dp 크기 programatically 변환 (0) | 2020.02.21 |
app:dataBindingGenBaseClassesDebug (0) | 2020.01.27 |
Fragment <-> Fragment로 데이터 주고 받기 / 번들 bundle / 인텐트 intent (0) | 2020.01.05 |
glide에 firestore reference로 이미지 load하기. (0) | 2019.12.30 |