[英]Java date string conversion to different format but with the same timezone
SimpleDateFormat from = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
SimpleDateFormat to = new SimpleDateFormat("MM/dd/yyyy Z");
Date date = from.parse("2017-08-10T00:00:00.000+0000");
String newDateStr = to.format(date);
newDateStr 是08/09/2017 -0500 。 我希望 newDataStr 可以與原始日期字符串 (0000) -- 08/10/2017 -0000 具有相同的時區。 我應該怎么做才能實現這一目標?
使用現代 Java 日期和時間 API java.time
更容易保留原始字符串的偏移量:
DateTimeFormatter from = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSZ");
DateTimeFormatter to = DateTimeFormatter.ofPattern("MM/dd/yyyy Z");
String newDateStr = OffsetDateTime.parse("2017-08-10T00:00:00.000+0000", from)
.format(to);
System.out.println(newDateStr);
這打印
08/10/2017 +0000
這不是建議更改為現代 API 的唯一原因。 您使用的Date
類已經過時了,尤其是SimpleDateFormat
以使用麻煩而聞名。 我總是建議在 2018 年遠離這些類。現代 API 通常要好得多。 並且由於您已經在使用 Java 8,因此您絕對沒有理由不想要它(對於任何閱讀並使用 Java 6 或 7 的人,新 API 也已向后移植到這些 Java 版本)。
老式的Date
對象只是一個時間點,它不包含時區或偏移量。 因此,在您將字符串解析為Date
,偏移信息不再存在。 因此,新的格式化程序Date
和to
都無法知道原始字符串中的偏移量或時區。 相反,新的格式化程序使用了自己的時區。 由於您沒有在格式化程序上明確設置時區,因此其時區是您的 JVM 的時區,這顯然是一個時區,在 2017 年 9 月的這些天與 UTC 的偏移量為 -5。
有一些棘手的方法可以解決過時的類的問題,但正如我可能已經說過的那樣,我不想打擾。
@Ponomarenko Oleh 在評論中寫道:
注意:Android 的“調用需要 API 級別 26”。
但是,java.time 在較舊和較新的 Android 設備上都能很好地工作。 它只需要至少Java 6 。
org.threeten.bp
導入日期和時間類。java.time
。java.time
到 Java 6 和 7 的 backport(ThreeTen for JSR-310)。您可以使用 Java 8 Date API,它提供了一組很好的功能來將日期轉換為字符串(包括時區支持)。
一個例子:
ZonedDateTime dateTime = ZonedDateTime.parse("2017-08-10T00:00:00.000+0000", DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"));
String newDateStr = dateTime.format(DateTimeFormatter.ofPattern("dd/MM/yyyy Z"));
有關更多信息,您可以查看:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.