[英]Displaying date/time in devices timezone on Android using Kotlin
所以我的應用程序從服務器的 JSON 文件中獲取信息,其中有一些日期/時間值。 時間和日期采用 UTC。 我需要在我的應用程序中以用戶本地時區顯示這些內容。
來自 JSON 的數據示例:
"start":"2018-10-20 03:00:00","finish":"2018-10-20 05:00:00"
到目前為止,我的代碼以 UTC 格式顯示日期和時間。
val dateStringStart = radioScheduleDMList.get(position).start
val dateStringEnd = radioScheduleDMList.get(position).finish
val date = SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.getDefault()).parse(dateStringStart)
val dateEnd = SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.getDefault()).parse(dateStringEnd)
val day = SimpleDateFormat("d MMM").format(date)
val startDate = SimpleDateFormat("ha").format(date)
val endDate = SimpleDateFormat("ha").format(dateEnd)
如何使用設備時區顯示這些數據? 我已經用谷歌搜索了幾個小時。
使用上面的示例,我的應用程序顯示日期為“20 OCT”,時間顯示為“3AM-5AM”。 就我而言,我住在澳大利亞(格林威治標准時間 + 10 點),所以我預計“10 月 20 日”和“下午 1 點至下午 3 點”是一天。 簡而言之,我想檢測用戶與 UTC 的時區偏移量並將其應用於顯示。
DateTimeFormatter jsonFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
DateTimeFormatter dateFormatter
= DateTimeFormatter.ofPattern("d MMM", Locale.forLanguageTag("en-AU"));
DateTimeFormatter hourFormatter
= DateTimeFormatter.ofPattern("ha", Locale.forLanguageTag("en-AU"));
ZoneId zone = ZoneId.systemDefault();
String dateStringStart = "2018-10-20 03:00:00";
OffsetDateTime startDateTime = LocalDateTime.parse(dateStringStart, jsonFormatter)
.atOffset(ZoneOffset.UTC);
ZonedDateTime userStartDateTime = startDateTime.atZoneSameInstant(zone);
String startDayString = userStartDateTime.format(dateFormatter);
String startTimeString = userStartDateTime.format(hourFormatter);
System.out.println("Start day: " + startDayString);
System.out.println("Start hour: " + startTimeString);
對不起,我不會寫 Kotlin。 您可以自己從 Java 翻譯嗎? 當我在具有默認時區澳大利亞/布里斯班的 JVM 上運行上述代碼時,它輸出:
Start day: 20 Oct Start hour: 1PM
只需對結束日期和時間執行類似操作即可。
是的,java.time 在較舊和較新的 Android 設備上都能很好地工作。 它只需要至少Java 6 。
org.threeten.bp
導入日期和時間類。java.time
日期時間。java.time
。java.time
到 Java 6 和 7 的 backport(ThreeTen for JSR-310)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.