gpt4 book ai didi

java - Date4j比较2次

转载 作者:行者123 更新时间:2023-11-30 03:35:30 26 4
gpt4 key购买 nike

所以,据我了解,Date4J ( http://www.date4j.net/javadoc/hirondelle/date4j/DateTime.html ) 比 JodaTime 更容易使用,所以我一直在我的一个项目中使用它。它运行良好,但我正在尝试为最后一次发生事件创建一个最后看到的函数。我有 2 个对象,lastOnline 和 now。它们的值如下:

LastOnline year 2015---Now.year--2015
LastOnline Month 1---Now.Month--1
LastOnline Day 18---Now.Day--18
LastOnline Hour 14---Now.Hour--14
LastOnline Minute 13---Now.Minute--33
LastOnline Second 24---Now.Second--15
LastOnline NanoSecond 1421590404000---Now.Nanosecond--1421591595316

我通过以下命令得到了它:

    System.out.println("LastOnline year " + lastOnline.getYear() + "---Now.year--" + now.getYear());
System.out.println("LastOnline Month " + lastOnline.getMonth() + "---Now.Month--" + now.getMonth());
System.out.println("LastOnline Day " + lastOnline.getDay() + "---Now.Day--" + now.getDay());
System.out.println("LastOnline Hour " + lastOnline.getHour() + "---Now.Hour--" + now.getHour());
System.out.println("LastOnline Minute " + lastOnline.getMinute() + "---Now.Minute--" + now.getMinute());
System.out.println("LastOnline Second " + lastOnline.getSecond() + "---Now.Second--" + now.getSecond());
System.out.println("LastOnline NanoSecond " + lastOnline.getMilliseconds(TimeZone.getTimeZone("UTC")) + "---Now.Nanosecond--" + now.getMilliseconds(TimeZone.getTimeZone("UTC")));

话虽如此,我查看了 .minus 函数的文档,但我似乎无法让它工作,它抛出了大量的 NullPointerExceptions,我似乎不明白为什么。这是我的减函数:

DateTime difference;
difference = now.minus(lastOnline.getYear(), lastOnline.getMonth(), lastOnline.getDay(), lastOnline.getHour(),
lastOnline.getMinute(), lastOnline.getSecond(), lastOnline.getNanoseconds(), DateTime.DayOverflow.FirstDay);

最后这是一个堆栈跟踪 -

java.lang.NullPointerException
at hirondelle.date4j.DateTime.minus(Unknown Source)
at globalFunctions.compareTime(globalFunctions.java:177)
at globalFunctions.logScrape(globalFunctions.java:158)
at Commands.bangCommands(Commands.java:32)
at Commands.handleCommands(Commands.java:9)
at listener.main(listener.java:53)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

最佳答案

TimeZone tz = TimeZone.getTimeZone("UTC");
DateTime now = DateTime.forInstant(1421591595316L, tz);
DateTime lastOnline = DateTime.forInstant(1421590404000L, tz);

DateTime difference =
now.minus(lastOnline.getYear(), lastOnline.getMonth(),
lastOnline.getDay(), lastOnline.getHour(),
lastOnline.getMinute(), lastOnline.getSecond(),
lastOnline.getNanoseconds(), DateTime.DayOverflow.FirstDay);

根据您的毫秒以来的纪元数据(您将其错误标记为纳秒部分)精确输入值,我没有得到 NPE,但是:

线程“main”hirondelle.date4j.DateTime$ItemOutOfRange 中出现异常:年份不在 1..9999 范围内。值为:-1。

对我来说,我宁愿期待零年的差异,而不是-1(这也超出了支持的范围)。可能是一个错误。在我测试了表达式 lastOnline.minus(lastOnline.getYear(), ...) 后,这种怀疑几乎是确定的。 即使两个操作数相同,行为也保持不变。但是,如果我将纳秒部分设置为null,那么我真的会得到一个 NPE:

    DateTime lastOnline = new DateTime(2015, 1, 18, 14, 13, 24, null);
DateTime now = new DateTime(2015, 1, 18, 14, 33, 15, null);

重要旁注:您是否尝试计算差异?但是 DateTime 对象是一个时间点,而不是差异。

Date4J 没有持续时间的概念,这意味着没有表示持续时间的对象模型,也没有不同处理字段和单位的概念(这导致支持的字段集非常差且狭窄)。因此,您尝试通过使用第二个参数的字段作为单位来计算两个 DateTime 对象之间的差异,然后将结果持续时间表示为新的“DateTime”对象(无法处理以年、月为单位的零持续时间)以及由于输入数据的范围限制而导致的天数)。

Date4J 计算持续时间唯一可用的方法显然是:

numDaysFrom

numSecondsFrom

=> 我的建议:Date4J 不能很好地处理持续时间的计算,因此您应该尝试使用能够计算从年到小数秒的持续时间的库。实际上我知道有两个库在做这个(Joda-Time 和我自己的库 - 都可以格式化持续时间)。

如果您对 Java-8 中的新 java-time-package 感兴趣,那么请考虑它无法做到这一点,这令人惊讶,仅以年-月-日(类 Period 或小时)计算持续时间- 分钟-秒-纳诺斯(类 Duration),但不混合。也许您可以在多单位时间增量类中使用这两个类的组合来详细说明解决方法。

关于java - Date4j比较2次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28010732/

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