带有TimeZone的SimpleDateFormat

Alg*_*oth 9 java android

我正在尝试从java.util.Date格式化日期.我需要这种格式:

2016-06-10T13:38:13.687+02:00.

如何从标准日期格式正确转换它

May 04 09:51:52 CDT 2009

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss z", Locale.getDefault());
sdf.format(new Date());
Run Code Online (Sandbox Code Playgroud)

遗憾的是,此代码没有返回值+02:00.

shr*_*ari 13

根据标准Java文档:https: //docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

获取日期和时间格式

2001-07-04T12:08:56.235-07:00


你需要使用下面的String模式:

"YYYY-MM-dd'T'HH:MM:ss.SSSXXX"

因此,使用以下代码,您可以得到您想要的:

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.getDefault());
    simpleDateFormat .format(new Date());
Run Code Online (Sandbox Code Playgroud)

  • @Algeroth 是的,我 100% 确定,您可以查看我在答案中提到的链接,XXX 是获取时区的有效模式,我建议您应该尝试一次。 (2认同)

SCo*_*uto 10

只需将你的z转换为upperCase即可

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss Z", Locale.getDefault());
    sdf.format(new Date());
Run Code Online (Sandbox Code Playgroud)

结果:2016-06-10T13:53:22 +0200

  • @Algeroth 你接受了这个答案,但你发布了你想要“2016-06-10T13:38:13.687+02:00”而不是“2016-06-10T13:53:22 +0200”的问题 (12认同)

Ole*_*.V. 6

是时候有人提供现代答案了。

\n\n
    OffsetDateTime now = OffsetDateTime.now(ZoneId.of("Africa/Cairo"));\n    String formatted = now.toString();\n    System.out.println(formatted);\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是刚刚打印的

\n\n
\n

2018-02-28T16:42:59.628526+02:00

\n
\n\n

编辑:我要求秒数保留 3 位小数,而不是 6 位。要对格式进行更多控制,请使用显式格式化程序:

\n\n
    DateTimeFormatter formatterWithThreeDecimals\n            = DateTimeFormatter.ofPattern("uuuu-MM-dd\'T\'HH:mm:ss.SSSXXXXX");\n    String formatted = now.format(formatterWithThreeDecimals);\n    System.out.println(formatted);\n
Run Code Online (Sandbox Code Playgroud)\n\n

此打印(在我编辑时):

\n\n
\n

2018-04-30T15:47:41.749+02:00

\n
\n\n

如果\xe2\x80\x99 不是非洲/开罗,请替换您所需的时区。指定ZoneId.systemDefault()您的 JVM\xe2\x80\x99s 时区设置。该设置可以随时由程序的另一部分或同一 JVM 中运行的另一个程序更改。

\n\n

使用 java.time(现代 Java 日期和时间 API),如果您只想要一个符合 ISO 8601 的输出并且不关心有多少个小数(或者如果秒为 0 则是否打印),我们don\xe2\x80\x99 根本不需要显式格式化程序。您所需的字符串采用 ISO 8601 格式,这是现代 classes\xe2\x80\x99toString方法生成的标准格式。根据您的需要,结果toString可能会被接受。

\n\n

您使用的类DateSimpleDateFormat早已过时,而后者尤其麻烦。我建议您避免使用它们并使用现代 API。和它一起工作真是太好了。

\n\n

如果您java.util.Date从旧版 API 中获得了一个您现在不想更改的 API,请将其转换为现代 API Instant,然后从那里进行进一步的转换。在 Java 8 及更高版本中,情况是这样的:

\n\n
    ZonedDateTime dateTime = oldfashionedDateFromLegacyApi.toInstant()\n            .atZone(ZoneId.of("Africa/Cairo"));\n    String formatted = dateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您使用 ThreeTen Backport 和/或 ThreeTenABP,转换的情况会略有不同,如下所示:

\n\n
    ZonedDateTime dateTime = DateTimeUtils.toInstant(oldfashionedDateFromLegacyApi)\n            .atZone(ZoneId.of("Africa/Cairo"));\n
Run Code Online (Sandbox Code Playgroud)\n\n

同样,如果您想密切控制输出格式,请不要使用\xe2\x80\x99t,DateTimeFormatter.ISO_OFFSET_DATE_TIME因为它将输出 1 到 9 个小数之间的任何内容,并且如果秒为 0,也可能会省略秒。而是使用formatterWithThreeDecimals上面的 my。

\n\n

问:我可以在 Android 上使用 java.time 吗?

\n\n

是的,java.time在 Android 上运行良好。它只需要至少 Java 6

\n\n
    \n
  • 在 Java 8 及更高版本以及较新的 Android 设备中,现代 API 是内置的。
  • \n
  • 在 Java 6 和 7 中,获取 ThreeTen Backport,即新类的向后移植(ThreeTen for JSR 310;请参阅底部的链接)。
  • \n
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它\xe2\x80\x99s 称为ThreeTenABP。并确保从org.threeten.bp子包中导入日期和时间类。
  • \n
\n\n

链接

\n\n\n