【问题标题】:Trying to find a way to calculate Jodatime instants overlap with java8试图找到一种方法来计算 Joda Time 与 java 8 的即时重叠
【发布时间】:2018-11-10 22:53:38
【问题描述】:

我目前正在考虑从 JodaTime 迁移到 java8 api。

大多数都可以,但有一件事让我无法理解。我需要计算一个人在“办公时间”内轮班工作的时间。

使用 JodaTime,我利用 Instant 类执行计算并取得了巨大成功:

DateTime in = new DateTime(inTime);
DateTime out = new DateTime(outTime);

Interval officeHours = new Interval(in.withTime(whstart.getHours(), 
whstart.getMinutes(), 0, 0),
in.withTime(whend.getHours(), whend.getMinutes(), 0, 0));

Interval shift = new Interval(in, out);
Interval overlap = officeHours.overlap(shift);

officeHoursSeconds = overlap != null ?
 overlap.toDuration().getStandardSeconds() : 0;

但是,由于 java8 中似乎缺少 Interval 类,所以对于如何最好地将这个逻辑移动到 java8 api 中,我有点茫然。

我当然可以继续使用 Jodatime,但由于它已停产,我想尝试将其完全删除。

非常感谢指针。

【问题讨论】:

    标签: datetime java-8 jodatime


    【解决方案1】:

    Joda 类 Interval 尚未被 Java-8 取代。我主要看到三种方式:

    a) 编写您自己的区间类(不过,查看源代码会有所帮助)

    b) 使用我的库 Time4J 和类 MomentInterval 与方法 findIntersection(...) 产生可选的交集间隔。存在转换为 Java-8 类的方法,例如产生 moment.toTemporalAccessor()java.time.Instant

    c) 使用库Threeten-Extra,它有一个同名的类Interval 及其方法intersection(...)。这里要先检查是否存在交集,否则会抛出异常。

    【讨论】:

    • 感谢您加入美诺。不过,我有一个问题——不要试图变得粗鲁或任何事情。如果我最好的解决方案是包含某种第三方库,并且我已经包含了 JodaTime,那么学习一个新库并切换到那个库有什么好处?再说一遍,不争论只是问!
    • @Mathias 标准 Java 由于大小限制而永远无法整合时间处理的所有方面,而 3rd 方库不关心这些限制。另请参阅OpenJDK 声明的内容:“解决所有日期/时间问题不是目标,但新 API 应该是外部扩展的合适基础。”关于 Joda-Time 和其他库的比较,好吧,Joda-Time 现在仅处于维护模式(仅修复错误,没有更大的增强)并且 - 与 Time4J 相比 - 已经缺乏一些东西,如天文学、更多日历、间隔处理等。
    • @Mathias 实际上,Joda-Time 不提供与 java.time 的良好互操作性,另请参阅这个未解决的旧 issue
    • 当然,听你说。但是所有这些东西——天文学、互操作性、更多日历等——都不适用于我的特定用例。我基本上只需要得到重叠并将其转换为秒。对于其他一切,java8 api 似乎可以满足我的需要。
    • @Mathias 如果您仍然对 Joda-Interval 感到满意,那么可以保留 Joda。但是,如果您热衷于摆脱 Joda,那么您可能会考虑使用这种重叠方法来实现您自己的简单间隔类。如果您的间隔功能需求如此之小,应该不会那么困难。也许 Threeten-Extra-Interval 的源代码是一个合适的开始,因为它足够简单/足够小,并且可以很容易地进一步简化。
    猜你喜欢
    • 1970-01-01
    • 2022-06-15
    • 2012-10-16
    • 2011-10-14
    • 2012-06-22
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多