我有一个使用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)
答案 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)
java.time。因此,就像在Java 8中一样:
String text = Instant.now().toString();
我现在正在跑步:
2018-12-19T13:37:37.186Z
org.threeten.bp
导入日期和时间类。如果直到迁移到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时,格式模式字母(大写)0
将X
打印为“时区”(实际上只是一个偏移量)。
Z
向Java 6和7(JSR-310的ThreeTen)的反向端口。java.time
。java.time
。