Instant.now等效于java.util.Date或Java 7

时间:2018-12-19 13:04:29

标签: java datetime java-8 java-7 datetime-format

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

例如,java.util.Date生成这样的日期: “ 2018-12-19T12:32:46.816Z”

使用 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); ,这个日期是:“ 2018-12-19T10:38:13.892”

Instant.parse

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

没有“ Z” 的另一个系统使用public class TableImpl implements TableType { List<RowImpl> implList = new ArrayList<>(); @Override public List<RowType> getRows() { return implList.stream().map(e -> (RowType) e).collect(Collectors.toList()); } } 解析此日期会引发错误:

  

java.time.format.DateTimeParseException:文本   无法在索引23处解析'2018-12-19T10:38:13.892'           在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)

2 个答案:

答案 0 :(得分:4)

Z的意思是UTC time zone,您可以将时区设置为UTC并手动附加Z

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));

答案 1 :(得分:2)

ThreeTen Backport

反向移植了现代Java日期和时间API

java.time。因此,就像在Java 8中一样:

    String text = Instant.now().toString();

我现在正在跑步:

  

2018-12-19T13:37:37.186Z

  • 在Java 8和更高版本以及更新的Android设备(API级别26以上)中,内置了现代API。
  • 在Java 6和7中,获得ThreeTen Backport,即新类的backport(JSR 310的ThreeTen;请参见底部的链接)。
  • 在(较旧的)Android上,使用Android版本的ThreeTen Backport。叫做ThreeTenABP。并确保您使用子包从org.threeten.bp导入日期和时间类。

过时的SimpleDateFormat

如果直到迁移到Java 8或更高版本之前,您都不希望依赖于外部依赖关系,(最正确的)解决方案是将其他两个答案(现在其中一个已删除)的各个部分组合起来: / p>

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

2018-12-19T13:37:37.285Z

它并不总是提供与Instant.toString完全相同的字符串,但是会提供Instant可以在其他系统中解析的字符串。尽管Instant.toString()只打印所需的小数位数,但是上面的SimpleDateFormat也会打印三个十进制的小数位数。

当格​​式化程序的时区为UTC时,格式模式字母(大写)0X打印为“时区”(实际上只是一个偏移量)。

链接