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 唯一可用的计算持续时间的方法显然是:
=> 我的建议:Date4J 不能很好地处理持续时间的计算,因此您应该尝试使用能够计算从年到小数秒的持续时间的库。实际上我知道有两个库在做这个(Joda-Time 和我自己的库——两者都可以格式化持续时间)。
如果 Java-8 中的新 java-time-package 对您来说很有趣,那么请考虑它不能令人惊讶地做到这一点,只计算年-月-日的持续时间(class Period
或 hours-minutes-seconds-nanos (class Duration
) 但不是混合的。也许你可以使用两者的组合来详细说明解决方法 classes在多单位时间增量-class.
所以,我的理解是 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 唯一可用的计算持续时间的方法显然是:
=> 我的建议:Date4J 不能很好地处理持续时间的计算,因此您应该尝试使用能够计算从年到小数秒的持续时间的库。实际上我知道有两个库在做这个(Joda-Time 和我自己的库——两者都可以格式化持续时间)。
如果 Java-8 中的新 java-time-package 对您来说很有趣,那么请考虑它不能令人惊讶地做到这一点,只计算年-月-日的持续时间(class Period
或 hours-minutes-seconds-nanos (class Duration
) 但不是混合的。也许你可以使用两者的组合来详细说明解决方法 classes在多单位时间增量-class.