2015-01-18 3 views
1

그래서 내 프로젝트 중 하나에서 Date4J (http://www.date4j.net/javadoc/hirondelle/date4j/DateTime.html)가 JodaTime보다 조금 더 사용하기 쉽다는 것을 알고 있습니다. 효과가 있지만 마지막으로 이벤트가 발생했을 때 마지막으로 본 기능을 만들려고합니다. 나는 2 개의 객체, lastOnline을 가지고 있습니다. 다음과 같이 이들의 값은 다음과 같습니다 말했다와Date4j compare 2 times

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 기능에 대한 설명서를 살펴했다 내가없는 것 : 나는 다음과 같은 명령을 것을 가지고

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 

그것을 작동 시키려면, 그것은 NullPointerExceptions의 톤을 던져 버리고 나는 이유를 알 수없는 것 같습니다. 여기 내 빼기 기능입니다 :

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

그리고 마지막으로 여기 스택입니다 trace--

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

"nanosecond"값을 1421591595316으로 이해할 수 없습니다. 문서에 유효한 값의 범위는 0-999,999,999입니다. –

+1

아, 알다시피, getMilliseconds() 메소드를 통해 얻지 만, 이것은 나노 초가 아닌 값입니다. 이것은 유닉스 시대 이후의 경과 된 밀리 초의 수입니다. –

+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를 얻을하지 않습니다) 나노초 부품으로 mislabelled하지만이 : 스레드

예외는 "주"hirondelle.date4j.DateTime $ ItemOutOfRange : 년의 범위 1..9999에 있지 않습니다. 값은 -1입니다. 나를 위해

, 차라리 (지원 범위를 벗어나도)는 0 년 대신 -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 개체의 차이를 계산하려고했습니다 (범위 제약 때문에 년, 월 및 일에 0으로 처리 할 수 ​​없음). 귀하의 입력 데이터). 기간을 계산하기 Date4J의

만 어떻게 든 가능한 방법은 분명히 있습니다 :

numDaysFrom

numSecondsFrom

=> 내 추천 : 당신이 에 시도해야하므로 Date4J 잘 기간의 계산을 처리하지 않습니다 년에서 분 초까지 기간을 계산할 수있는 라이브러리를 사용하십시오. 실제로 나는 이것을하는 두 개의 libs를 알고있다. (Joda-Time과 내 자신의 라이브러리 - 둘 다 포맷 시간도 가능하다.)

Java-8의 새로운 java-time-package가 흥미로운 경우 놀랍게도이 작업을 수행 할 수 없다고 생각하고 년 - 월 - 일 (기간은 Period 또는 시간 - 분 - 초 - nanos (클래스 Duration)하지만 혼합되지는 않습니다. 아마도 다중 단위 시간 델타 클래스에서 두 클래스의 조합을 사용하여 해결 방법을 자세히 설명 할 수 있습니다.