Chuyển đổi giữa Kotlin LocalDate và Timestamp - 88win

Mục lục

Trong khi làm việc với Android Jetpack Compose, nếu sử dụng MaterialDatePicker, ngày được trả về sẽ ở dạng timestamp kiểu Long. Tôi muốn chuyển đổi giá trị này sang kiểu LocalDate.

Kiểu dữ liệu được trả về từ datepicker

1630195200000

Kiểu dữ game ban ca doi thuong liệu được lưu vào cơ sở dữ liệu địa phương trong data class convertor

1630195200

Hàm chuyển đổi tương ứng là:

@TypeConverter
fun dateToTimestamp(date: LocalDate?): Long? {
  val zoneId: ZoneId = ZoneId.systemDefault()
  return date?.atStartOfDay(zoneId)?.toEpochSecond()
}

Xem trực tuyến thời gian hiện tại dưới dạng timestamp

Chuyển đổi 1630195200 thành thời gian có thể đọc được:

Định dạng: Giây
GMT: Chủ nhật, ngày 29 tháng 8 năm 2021, 00:00:00 GMT+0000
Múi giờ của bạn: Chủ nhật, ngày 29 tháng 8 năm 2021, 08:00:00 GMT+0800 (Giờ Tiêu chuẩn Trung Quốc)

Cách khởi tạo LocalDate từ số nguyên đại diện cho timestamp

// chuyển đổi từ long sang LocalDate
val date = Instant.ofEpochMilli(it).atZone(ZoneId.systemDefault()).toLocalDate();

Do LocalDate chỉ có hàm ofEpochDay để chuyển đổi từ số ngày kể từ kỷ nguyên (epoch day) sang LocalDate. Ví dụ: val date = LocalDate.ofEpochDay(days)

Ngoài ra không có sẵn hàm nào như ofEpochSecond cho LocalDate. Chỉ có LocalDateTime mới hỗ trợ chức năng này. Vì vậy, cách duy nhất là sử dụng phương pháp đã nêu trên.

Lưu ý thêm rằng sự khác biệt giữa các múi giờ có thể ảnh hưởng đến kết quả cuối cùng khi thực hiện chuyển đổi. Do đó, cần đặc biệt chú ý đến việc xác định đúng ZoneId để đảm bảo tính chính xác của thời gian sau khi chuyển đổi.

Nếu muốn chuyển đổi ngược lại từ LocalDate sang timestamp giây, chúng ta cũng có thể áp dụng cách tương tự bằng cách sử dụng toEpochSecond() với việc chỉ định đúng múi giờ hệ thống mặc định hoặc bất trực tiếp bóng đá kỳ múi giờ cụ thể nào khác mà chương trình yêu cầu.