Instant.now 相当于 java.util.Date 或 Java 7

Com*_*red 2 java datetime datetime-format java-7 java-8

我有一个使用 Java 7 的系统,我需要生成一个与Instant.now(Java 8) 等效的日期。

例如,Instant.now().toString()生成如下日期: “2018-12-19T12:32:46.816Z”

使用java.util.Date我有这个日期:“2018-12-19T10:38:13.892”

    Date date = new Date(System.currentTimeMillis());
    SimpleDateFormat sdf;
    sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
    String text = sdf.format(date);
    System.out.println(text);
Run Code Online (Sandbox Code Playgroud)

我不知道是否可以简单地在该日期末尾连接一个“Z” 。

如果没有“Z”,另一个解析此日期的系统Instant.parse会抛出错误:

java.time.format.DateTimeParseException:无法在 java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1988) 的索引 23 处解析文本“2018-12-19T10:38:13.892” .base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1890) 在 java.base/java.time.Instant.parse(Instant.java:395)

Ole*_*.V. 5

三十向后移植

\n\n

java.time(现代 Java 日期和时间 API)已向后移植。所以就像在 Java 8 中一样:

\n\n
    String text = Instant.now().toString();\n
Run Code Online (Sandbox Code Playgroud)\n\n

刚才运行我得到:

\n\n
\n

2018-12-19T13:37:37.186Z

\n
\n\n
    \n
  • 在 Java 8 及更高版本以及较新的 Android 设备(从 API 级别 26 开始)中,现代 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

过时的 SimpleDateFormat

\n\n

如果您在迁移到 Java 8 或更高版本之前不想依赖外部依赖项,那么(最)正确的解决方案是其他两个答案中的部分的组合(其中一个现已删除):

\n\n
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd\'T\'HH:mm:ss.SSSXX");\n    sdf.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));\n    String text = sdf.format(System.currentTimeMillis());\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

2018-12-19T13:37:37.285Z

\n
\n\n

它并不总是给出与 完全相同的字符串,但它会给出一个可以在其他系统中解析的Instant.toString字符串。Instant虽然Instant.toString()只打印所需数量的小数,SimpleDateFormat但当其中一些是 时,上面的代码也会打印三位小数0

\n\n

当格式化程序的时区为 UTC 时,格式模式字母(大写)X将打印Z为 \xe2\x80\x9ctime zone\xe2\x80\x9d (实际上只是一个偏移量)。

\n\n

链接

\n\n\n