gpt4 book ai didi

Java 8 : Convert file time (milliseconds from 1970) to RFC 1123 format

转载 作者:搜寻专家 更新时间:2023-11-01 01:25:42 24 4
gpt4 key购买 nike

这看起来应该很简单,但到目前为止,我尝试的一切都没有奏效。基本上我想将文件时间从 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()));

结果

Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException:Unsupported field: 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));

最佳答案

Instant 类型不包含时区信息。您可以像这样为格式化程序定义时区:

System.out.println(java.time.format.DateTimeFormatter.RFC_1123_DATE_TIME
.withZone(ZoneId.systemDefault()).format( FileTime.from(0, TimeUnit.MILLISECONDS).toInstant()));

编辑:

实际上,格式化程序没有分配时区以及表示类的日期/时间是有原因的。考虑以下示例:

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
  • Instant 表示实际时间点,不涉及特定位置,因此没有时区。出现异常 (1) 和 (2) 是因为要表示特定时间点,格式化程序需要一个时区以使输出对人类可读。
  • ZonedDateTime 表示也分配给特定时区的实际时间点。格式化它们完全没有问题,但请考虑最后一个示例。如果您在格式化程序中设置时区,您可能会得到不同的结果。
  • LocalDateTime 不代表实际时间点。您甚至可以分配一个在某些时区无效的值,例如在夏令时的情况下将时钟向前推 1 小时。要获得真实的时间点,您必须将其与时区结合使用(如上例所示)。出现异常 (3) 和 (4),因为格式化程序想要打印时区值,而此类型中不存在该值。

我不明白为什么设计者选择在运行时而不是编译时发现所描述的问题。也许这会使类层次结构过于复杂。

关于Java 8 : Convert file time (milliseconds from 1970) to RFC 1123 format,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31524685/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com