簡體   English   中英

Java 日期字符串轉換為不同格式但具有相同時區

[英]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 ,偏移信息不再存在。 因此,新的格式化程序Dateto都無法知道原始字符串中的偏移量或時區。 相反,新的格式化程序使用了自己的時區。 由於您沒有在格式化程序上明確設置時區,因此其時區是您的 JVM 的時區,這顯然是一個時區,在 2017 年 9 月的這些天與 UTC 的偏移量為 -5。

有一些棘手的方法可以解決過時的類的問題,但正如我可能已經說過的那樣,我不想打擾。

適用於 Android 的“調用需要 API 級別 26”

@Ponomarenko Oleh 在評論中寫道:

注意:Android 的“調用需要 API 級別 26”。

但是,java.time 在較舊和較新的 Android 設備上都能很好地工作。 它只需要至少Java 6

  • 在 Java 8 及更高版本和更新的 Android 設備(從 API 級別 26)中,現代 API 是內置的。 這也是評論中引用的消息的預期含義。
  • 在非 Android Java 6 和 7 中獲得 ThreeTen Backport,現代類的 backport(ThreeTen for JSR 310;請參閱底部的鏈接)。
  • 在(較舊的)Android 上使用 ThreeTen Backport 的 Android 版本。 它被稱為 ThreeTenABP。 並確保使用子包從org.threeten.bp導入日期和時間類。

鏈接

您可以使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM