Date4j比较2次

时间:2015-01-18 14:22:11

标签: java datetime

所以,我的理解是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)

1 个答案:

答案 0 :(得分:2)

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:Year不在1..9999范围内。值为:-1。

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

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

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

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

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

numDaysFrom

numSecondsFrom

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

如果Java-8中新的java-time-package对你很有意思,那么考虑到它不能令人惊讶,只计算几年 - 几个月 - 日(类Period或小时 - 分钟 - 的持续时间 - seconds-nanos(类Duration)但没有混合。也许你可以在多单元时间delta类中使用两个类的组合来详细说明解决方法。