java 在转换和扩充值时,使用ZoneDateTime和Calendar有什么影响?[关闭]

epggiuax  于 2023-06-20  发布在  Java
关注(0)|答案(1)|浏览(82)
    • 已关闭**,此问题为opinion-based。目前不接受答复。
    • 想改善这个问题吗?* * 更新问题,以便editing this post可以用事实和引用来回答。

昨天关门了。
截至14小时前,社区正在审查是否重新讨论这个问题。
Improve this question
我不知道为什么这个问题被关闭,因为它显然不是基于意见。
我不确定使用 * Calendar * 对象时会发生什么不可预见的影响,特别是失效,而使用 * ZonedDateTime * 对象时会发生什么。
我想知道是否可以提供洞察力,为什么值的转换或解析必须使用一个框架而不是另一个框架来完成。
我已经查看了 * Java教程 *,参考 legacy date-time code,我无法获得可能发生无效的地方。
为了解释,教程提到了以下内容。

  • "Calendar类不是类型安全的"。*

我不关心类型安全,解析只是几个步骤。

  • "因为类是可变的,所以不能在多线程应用程序中使用"。*

可变状态不是主题。
“应用程序代码中的错误很常见,因为月份的编号不寻常,而且缺乏类型安全性。
我不关心索引和枚举。
所有这些观点都不是抽象的对立面。
作为演示,我将同时使用这两个类,试图讨论它们的逻辑。
我可以使用 * SimpleDateFormat * 和 * Calendar * 解析格式化的 * String * 值。

String string = "MMMM dd, yyyy '@' h:mm:ss a z";
SimpleDateFormat format = new SimpleDateFormat(string);
String value = "May 28, 2023 @ 6:50:01 pm EDT";
Calendar calendar = Calendar.getInstance();
calendar.setTime(format.parse(value));

如果我打印 * calendar * 中的数据,我会收到一个有效的结果。

System.out.println(calendar.getTimeInMillis());
System.out.printf("%tc", calendar.getTimeInMillis());
1685314201000
Sun May 28 18:50:01 EDT 2023

而且,我可以使用 * DateTimeFormatter * 和 * ZonedDateTime * 解析相同的格式化 * String * 值。
当然,我必须将 * value * 中的 "PM" 大写-这不是一个倒退。

  • DateTimeParseException * 甚至指定了一个字符索引。
DateTimeFormatter format = DateTimeFormatter.ofPattern(string);
ZonedDateTime zonedDateTime = ZonedDateTime.parse(value, format);

类似地,如果我打印 * zonedDateTime * 中的数据,我会得到一个有效的结果。

System.out.println(zonedDateTime.toInstant().toEpochMilli());
System.out.printf("%tc%n", zonedDateTime.toInstant().toEpochMilli());
System.out.println(zonedDateTime);
1685314201000
Sun May 28 18:50:01 EDT 2023
2023-05-28T18:50:01-04:00[America/New_York]

如果您并排查看数据,您会发现它们是等效的,因此两者都有效。
如果我想增加这些值,比如说,通过添加4小时,* 因为EDT是UTC-4 *,以获得UTC值;我可以用这两个类来实现。
对于 * Calendar * 类,我可以使用 * add * 方法。
它在 * Calendar * 类中有一个可扩展的规范。

calendar.add(Calendar.HOUR_OF_DAY, 4);
1685328601000
Sun May 28 22:50:01 EDT 2023

同样,对于 * zonedDateTime *,我可以使用 * plusHours * 方法。

zonedDateTime = zonedDateTime.plusHours(4);
1685328601000
Sun May 28 22:50:01 EDT 2023
2023-05-28T22:50:01-04:00[America/New_York]

同样,我得到了相同的值,即 * Calendar * 与 * ZonedDateTime *。
如果我从 * 1,685,328,601,000 * 减去 * 1,685,314,201,000 *,我得到 * 14,400,000 *。

  • 14,400,000 * 相当于,* 4小时 * ×(* 60分钟 * ×(* 60秒 * × * 1000毫秒 *))。

这让我得出了我的结论,在基本解析和增强方面,使用一个类对另一个类的不利影响。
当使用一个类与另一个类进行比较时,计算出的不可预见的错误是什么?
例如,某个类是否使用了更精确的年份度量,如 * 365.25天 *,超过 * 365.2425 *?
除了Java所陈述的设计含义之外,一个类在哪里被证明比另一个类更符合习惯-考虑到两者都将生成等效的值。
我的意思是从哲学的Angular 来看,而不是从新教的范式和意识形态的Angular 来看。
经验证据不一定适用。

vom3gejh

vom3gejh1#

不,他们没有使用“更准确的年份测量”。没有任何方面的日历是 * 不正确 * 或将导致值只是错误的。
日历是过时的,因为它很难正确使用。将月份编号从0到11,而不是从1到12。它还将物理时代和文明时代混为一谈,这是很重要的,要区分它们。
用java.util.Calendar编写100%正确的代码是可能的。但大多数人不会。

相关问题