Date4j比较2次

Date4j compare 2 times

所以,我的理解是 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-object 是时间点,而不是差异。

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

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

numDaysFrom

numSecondsFrom

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

如果 Java-8 中的新 java-time-package 对您来说很有趣,那么请考虑它不能令人惊讶地做到这一点,只计算年-月-日的持续时间(class Period 或 hours-minutes-seconds-nanos (class Duration) 但不是混合的。也许你可以使用两者的组合来详细说明解决方法 classes在多单位时间增量-class.