1 回答

TA貢獻1805條經(jīng)驗 獲得超10個贊
有什么問題?
嚴(yán)重問題清單包括:
您正在使用設(shè)計糟糕且過時已久的 Java 日期和時間類
Date
,TimeZone
并且SimpleDateFormat
.您正在使用已棄用的方法
getMonth
和類。這些方法跨時區(qū)工作不可靠,這是它們被棄用的主要原因。getDate
getYear
Date
您正在使用加法、減法和乘法手動進行時區(qū)轉(zhuǎn)換。日期和時間數(shù)學(xué)容易出錯,您應(yīng)該始終將其留給經(jīng)過驗證的庫方法。
您獲得的毫秒計數(shù)
Date.getTime
是自 1970-01-01T00:00:00 UTC 時代以來。這是一個獨特的時刻,與時區(qū)無關(guān),因此在時區(qū)轉(zhuǎn)換的毫秒計數(shù)中增加和減少是沒有意義的。當(dāng)我將 JVM 的默認(rèn)時區(qū)設(shè)置為 Asia/Seoul 并假設(shè)該時區(qū)
HOUR
為 0(或 0 到 111 范圍內(nèi)的某個值)時,我可以重現(xiàn)您的結(jié)果。我假設(shè)您想要HOUR
表示一小時內(nèi)的毫秒數(shù),3 600 000(至少通常存在例外)。您通過連接對 的調(diào)用結(jié)果來格式化您的日期
Strirg.format
。最好將格式化留給專門的日期格式化程序。
修復(fù):java.time
ZoneId serverTimeZone = ZoneId.of("Asia/Seoul");
DateTimeFormatter serverFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
ZoneId clientTimeZone = ZoneId.systemDefault();
String checkedDate = "2019-06-24 16:15:31";
ZonedDateTime serverDateTime = LocalDateTime.parse(checkedDate, serverFormatter)
.atZone(serverTimeZone);
ZonedDateTime clientDateTime = serverDateTime.withZoneSameInstant(clientTimeZone);
System.out.println("clientDateTime: " + clientDateTime);
抱歉,我只能編寫和運行 Java 代碼,我相信你會翻譯。由于我的 JVM 時區(qū)仍設(shè)置為 Asia/Seoul,我得到:
clientDateTime: 2019-06-24T16:15:31+09:00[亞洲/首爾]
服務(wù)器時間和客戶端時間相同,如您所要求的。相反,如果我保留自己的時區(qū),我會得到:
clientDateTime:2019-06-24T09:15:31+02:00[歐洲/哥本哈根]
所以發(fā)生了轉(zhuǎn)換。
格式化日期:
DateTimeFormatter displayFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM) .withLocale(Locale.forLanguageTag("ko-KR")); String transformedLocalDate = clientDateTime.format(displayFormatter); System.out.println("transformedLocalDate: " + transformedLocalDate);
transformedLocalDate: 2019. 6. 24.
或者,如果您堅持使用 month.date.year:
DateTimeFormatter displayFormatter = DateTimeFormatter.ofPattern("MM.dd.u");
transformedLocalDate:06.24.2019
進一步的建議是讓您的服務(wù)器以 ISO 8601 格式提供 UTC 日期時間字符串。這就像2019-06-24T07:15:31Z
示例中暫時使用的那樣。
問題:我可以在 Android 上將 java.time 與 minSdk API 級別 23 一起使用嗎?
是的,java.time 在新舊 Android 設(shè)備上都能很好地工作。它只需要至少Java 6。
在 Java 8 及更高版本以及較新的 Android 設(shè)備(從 API 級別 26 開始)中,現(xiàn)代 API 是內(nèi)置的。
在 Java 6 和 7 中獲得 ThreeTen Backport,現(xiàn)代類的 backport(ThreeTen 用于 JSR 310;請參閱底部的鏈接)。
在(較舊的)Android 上使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并確保從
org.threeten.bp
子包中導(dǎo)入日期和時間類。
添加回答
舉報