我正在嘗試構建一個聊天應用程式,我想在 Firebase RealTime-Database 中存盤每條訊息的日期,使用ServerValue.TIMESTAMP它以毫秒為單位存盤日期和時間,并且它是服務器端的。我想要實作的是將毫秒轉換為安全的日期格式,該格式將具有類似“2022 年 11 月 11 日,星期四,14:42”的模式,但我閱讀了很多關于 Java 的不安全日期和格式庫的內容。我的應用程式使用 FirebaseUI,它就像一種異步方式來觀察/通知/偵聽我的資料庫的變化,所以我需要一些安全的東西,并受到 API/SDK 級別 21 的支持
這是我目前擁有的代碼
Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(model.sentOnDateInMilliseconds); String date = DateFormat.getDateInstance(DateFormat.FULL).format(calendar.getTime());
我嘗試像這樣預覽我想要的格式
textView.setText(MessageFormat.format("{0} {1}:{2} {3}", date, calendar.get(Calendar.HOUR), calendar.get(Calendar.MINUTE), calendar.get(Calendar.AM_PM)));
有什么建議么?
uj5u.com熱心網友回復:
避免遺留課程
切勿使用SimpleDateFormat、Calendar或任何一個Date類。這些遺留類存在嚴重缺陷,不了解日期時間處理的人做出糟糕的設計決策。
它們的現代替代品是JSR 310 中定義的java.time類。
java.time
您使用的是多年前被JSR 310 中定義的現代java.time類取代的糟糕日期時間類。
雖然沒有明確記錄,但顯然型別表示自UTC 1970 年第一個時刻1970-01-01T00:00:00Z的紀元參考firebase.database.ServerValue.TIMESTAMP以來的毫秒數。
java.time.Instant
Java 中的匹配類是java.time.Instant.
Instant instant = Instant.ofEpochMilli( millisSinceEpoch ) ;
您可以從Instant. 當心資料丟失:AInstant的解析度為納秒,因此獲取毫秒數會忽略微秒/納秒。
Instant instant = Instant.now() ; // Capture the current moment as seen with an offset of zero hours-minutes-seconds from UTC.
long millisSinceEpoch = instant.toEpochMilli() ;
java.time.ZonedDateTime
將毫秒轉換為安全的日期格式,其格式將類似于“2022 年 11 月 11 日,星期四,14:42”
要以標準ISO 8601以外的格式生成文本,我們需要一個比Instant. 我們需要將該時刻從 UTC 的零時分秒偏移量調整為用戶期望的時區(或偏移量)。
ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
java.time.format.DateTimeFormatter
要生成文本,我們必須指定一種格式。您可以對格式進行硬編碼,也可以讓java.time自動本地化。為了本地化,我們指定 aLocale來確定本地化所需的人類語言和文化規范,例如星期幾。
Locale locale = Locale.UK ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.LONG ).withLocale( locale ) ;
String output = zdt.format( f ) ;
轉儲到控制臺。
System.out.println( "instant = " instant );
System.out.println( "millisSinceEpoch = " millisSinceEpoch );
System.out.println( "output = " output );
運行時。
instant = 2022-11-18T19:27:22.561715Z
millisSinceEpoch = 1668799642561
output = Saturday, November 19, 2022 at 4:27:22 AM Japan Standard Time
Android 26 帶有java.time類的實作。對于早期的 Android,最新的工具通過“API 脫糖”提供對大多數java.time功能的訪問。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/536968.html
標籤:爪哇日期日期格式安卓日历
下一篇:計算表格中的唯一元素
