【发布时间】:2019-05-19 23:36:41
【问题描述】:
我有一个使用 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);
我不知道我是否可以在这个日期的末尾简单地连接一个 "Z"。
如果没有 "Z",另一个使用 Instant.parse 解析此日期的系统会引发错误:
java.time.format.DateTimeParseException:文本 '2018-12-19T10:38:13.892' 无法在索引 23 处解析 在 java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1988) 在 java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1890) 在 java.base/java.time.Instant.parse(Instant.java:395)
【问题讨论】:
-
你考虑过ThreeTen Backport吗? java.time 是现代 Java 日期和时间 API,已向后移植到 Java 6 和 7。
-
java.util.Date本身没有时区(Z代表的地方),所以你必须添加它。例如格式:sdf.setTimeZone(TimeZone.getTimeZone("UTC")); -
@Glains 实际上,
Z代表 UTC,表示与 UTC 的偏移量为零时分秒,不是时区。时区是特定地区的人们使用的偏移量的过去、现在和未来变化的历史。java.util.Date和java.time.Instant一样,表示 UTC 中的一个时刻,因为它只是自 1970 年 UTC 第一时刻的纪元参考以来的一个计数。Date是自 1970-01-01T00:00:00Z 以来的毫秒数,Instant是纳秒数,根据定义,两者都代表 UTC 中的时刻。
标签: java datetime java-8 java-7 datetime-format