这似乎应该很简单,但到目前为止我没有尝试过工作.基本上我想将文件时间(以毫秒为单位)从1970(通常)转换为TemporalAccessor,然后转换为RFC 1123格式的字符串.但是,虽然我可以获得编译的示例,但我得到运行时错误.例如:
// Just using 0 milliseconds time for quick and easy test
System.out.println(java.time.format.DateTimeFormatter.RFC_1123_DATE_TIME.format(
FileTime.from(0, TimeUnit.MILLISECONDS).toInstant()));
Run Code Online (Sandbox Code Playgroud)
结果是
线程"main"中的异常java.time.temporal.UnsupportedTemporalTypeException:不支持的字段:DayOfMonth
我尝试了使用不同类(Instant,LocalTime,Date)的一些变体,但我得到了相同的结果.
这样做的正确方法是什么?
更新:原始问题已在技术上得到解答,我意识到我需要更具体.我自己已经"成功"将毫秒转换为TemporalAccessor,但看起来这个对象似乎没有处于可用状态.我试图用它来做我真正需要的东西时遇到了运行时错误,这让我觉得我没有正确创建它.那东西不见了.RFC 1123格式化程序中存在错误或存在错误.
更新2:感谢Sleafar发布工作答案.
使用他的例子我做的略有不同,因为由于某种原因我真的想要一个'完整'的TemporalAccessor来做事情.这是一个工作示例:
TemporalAccessor time = ZonedDateTime.ofInstant(Instant.ofEpochMilli(0),
ZoneId.systemDefault());
System.out.println(
java.time.format.DateTimeFormatter.RFC_1123_DATE_TIME.format(time));
Run Code Online (Sandbox Code Playgroud)
该Instant
类型不包含时区信息.您可以为此格式化程序定义时区:
System.out.println(java.time.format.DateTimeFormatter.RFC_1123_DATE_TIME
.withZone(ZoneId.systemDefault()).format( FileTime.from(0, TimeUnit.MILLISECONDS).toInstant()));
Run Code Online (Sandbox Code Playgroud)
编辑:
实际上有理由让没有指定时区的格式化程序,以及表示类的日期/时间.请考虑以下示例:
ZoneId ect = ZoneId.of(ZoneId.SHORT_IDS.get("ECT"));
DateTimeFormatter f1 = DateTimeFormatter.RFC_1123_DATE_TIME;
DateTimeFormatter f2 = f1.withZone(ect);
DateTimeFormatter f3 = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
DateTimeFormatter f4 = f3.withZone(ect);
LocalDateTime ldt = LocalDateTime.of(2015, 07, 21, 0, 0, 0, 0);
ZonedDateTime zdt = ZonedDateTime.of(ldt, ect);
Instant ins = zdt.toInstant();
System.out.println(f1.format(ins)); // throws exception (1)
System.out.println(f2.format(ins)); // Tue, 21 Jul 2015 00:00:00 +0200
System.out.println(f3.format(ins)); // throws exception (2)
System.out.println(f4.format(ins)); // 2015-07-21T00:00:00
System.out.println(f1.format(zdt)); // Tue, 21 Jul 2015 00:00:00 +0200
System.out.println(f2.format(zdt)); // Tue, 21 Jul 2015 00:00:00 +0200
System.out.println(f3.format(zdt)); // 2015-07-21T00:00:00
System.out.println(f4.format(zdt)); // 2015-07-21T00:00:00
System.out.println(f1.format(ldt)); // throws exception (3)
System.out.println(f2.format(ldt)); // throws exception (4)
System.out.println(f3.format(ldt)); // 2015-07-21T00:00:00
System.out.println(f4.format(ldt)); // 2015-07-21T00:00:00
ZoneId hst = ZoneId.of(ZoneId.SHORT_IDS.get("HST"));
ZonedDateTime zdt2 = ZonedDateTime.of(ldt, hst);
System.out.println(f1.format(zdt2)); // Tue, 21 Jul 2015 00:00:00 -1000
System.out.println(f2.format(zdt2)); // Tue, 21 Jul 2015 12:00:00 +0200
System.out.println(f3.format(zdt2)); // 2015-07-21T00:00:00
System.out.println(f4.format(zdt2)); // 2015-07-21T12:00:00
Run Code Online (Sandbox Code Playgroud)
Instant
表示实际时间点而不参考特定位置,因此没有时区.引发异常(1)和(2)是因为为了表示格式化器需要时区以使输出对人类可读的特定时间点.ZonedDateTime
表示也分配给特定时区的实际时间点.没有任何问题可以格式化它们,但请考虑最后一个例子.如果在格式化程序中设置时区,则可能会得到不同的结果.LocalDateTime
并不代表实际的时间点.您甚至可以在某些时区指定一个无效的值,例如在夏令时的情况下将时钟向前推进1小时.要获得真正的时间点,您必须将其与时区结合(如上例所示).引发异常(3)和(4),因为格式化程序要打印时区值,此类型中不存在该值.我不知道为什么设计者选择在运行时而不是编译时发现所描述的问题.也许它会使类层次结构太复杂.
归档时间: |
|
查看次数: |
1850 次 |
最近记录: |