所以,我的理解是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)
答案 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
,那么我真的得到了一个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没有持续时间的概念,这意味着没有表示持续时间的对象模型,也没有对字段和单位的不同处理的概念(这导致非常差和窄的支持字段集)。因此,您尝试使用第二个arg的字段作为单位计算两个DateTime
对象之间的差异,然后将结果持续时间表示为新的“DateTime”对象(无法处理零年,月和日的零持续时间)对输入数据的范围限制。)
Date4J唯一可用于计算持续时间的方法显然是:
=>我的建议:Date4J不能很好地处理持续时间的计算,所以你应该尝试使用能够计算从数年到数小时的持续时间的库。实际上我知道有两个lib这样做(Joda-Time和我自己的库 - 两者都可以格式化持续时间)。
如果Java-8中新的java-time-package对你很有意思,那么考虑到它不能令人惊讶,只计算几年 - 几个月 - 日(类Period
或小时 - 分钟 - 的持续时间 - seconds-nanos(类Duration
)但没有混合。也许你可以在多单元时间delta类中使用两个类的组合来详细说明解决方法。