2012-06-20 10 views
5

Próbuję wprowadzić Joda-Time, aby odliczyć do Świąt Bożego Narodzenia, ale do tej pory jestem uderzony. Wypróbowałem java.util.Date i większość pytań i odpowiedzi związanych z StackOverflow sugerowało używanie Joda-Time. Ale nie mogę tego uruchomić. Niektóre kody dają różne odpowiedzi.Odliczaj do Bożego Narodzenia z Joda-Time

Oto niektóre kody próbowałam

DateTime now = new DateTime(); 
DateTime christmas = new DateTime(2012, 12, 25, 8, 0, 0, 0); 
Days daysToChristmas = Days.daysBetween(today, christmas); 
System.out.println(daysToChristmas.toString()); 

I to drukuje P187D jako odpowiedź.

DateTime start = new DateTime(DateTime.now()); 
DateTime end = new DateTime(2012, 12, 25, 0, 0, 0 ,0); 
Interval interval = new Interval(start, end); 
Period period = interval.toPeriod(); 
System.out.println("Seconds " + period.getSeconds()); 
System.out.println("Minutes " + period.getMinutes()); 
System.out.println("Hours " + period.getHours()); 
System.out.println("Days " + period.getDays()); 

I Drukuje następujące rezultacie

Seconds 36 
Minutes 21 
Hours 7 
Days 4 

Gdzie poszło nie tak?

+0

Co jest nie tak z pierwszym kodem? –

+0

Drukuje P187D. Jak uzyskać Dni, godziny, minuty i sekundy z tego obiektu? –

Odpowiedz

11

Powinieneś użyciu Period w celu ustalenia liczby miesięcy/dni/etc zaangażowane:

Period period = new Period(start, end); 

Konwersja Interval na okres byłby w porządku, ale bez parametrów przeciążenie obejmuje wszystkie jednostki okresu - a ty nie drukujesz miesięcy.

Teraz, jeśli chcesz mieć tylko dni, godziny, minuty, sekundy, musisz utworzyć odpowiednią PeriodType, np.

PeriodType periodType = PeriodType.dayTime().withMillisRemoved(); 
Period period = new Period(start, end, periodType); 

Następnie możesz poprosić o te pojedyncze pola, a wszystko powinno być dobrze.

(Można rzeczywiście używać tylko dayTime(), zważywszy, że millis nie będzie kolidować z niczym innym.)

Więc można albo zbudować swój okres bezpośrednio z start i end jak powyżej, lub jeśli chcesz Utrzymuj Interval, można użyć:

Period period = interval.toPeriod(periodType); 
+0

Nie mogę uwierzyć, że mówię wam o wszystkich ludziach, ale ... Sądzę, że nie zgadzasz się z tym pierwszym zdaniem. Klasa ['Interval'] (http://www.joda.org/joda-time/apidocs/org/joda/time/Interval.html) rzeczywiście rozumie początkowe i końcowe obiekty DateTime. Podejrzewam, że pomieszałeś Interval z klasą ['Duration'] (http://www.joda.org/joda-time/apidocs/org/joda/time/Duration.html). W Joda-Time czas trwania jest długością w milisekundach, bez pozycji na osi czasu. Kod przykładowy użycia Interwału jest poprawny, jeśli nie jest konieczny. –

+0

@BasilBourque: Masz absolutną rację, że myliłem się z czasem. 'Interval' jest moim zdaniem nadal * logicznie * nieprawidłowym typem, ponieważ jest udokumentowany jako czas pomiędzy dwoma * chwilami *, co oznacza, że ​​nie powinno być żadnych chronologii - jednak' Interval' również przechowuje 'Chronologię', więc możesz rzeczywiście odzyskać odpowiednie punkty końcowe jako wartości "DateTime". Myślę, że najlepiej będzie po prostu wyszorować pierwszą parę zdań, co teraz zrobię :) –

+0

@BasilBourque: Postanowiłem trochę bardziej zrestrukturyzować, w końcu. Dziękuję bardzo za korektę! –

2

Pierwszy kod drukuje format P187D, w formacie ISO 8601.

Drugi kod drukuje tylko 4 dni, ponieważ brakuje ci miesięcy (period.getMonths()).

+0

Cóż, czy istnieje sposób na konwersję miesięcy na daty, nie potrzebuję miesięcy, potrzebuję tylko dni. –

+0

@Jon odpowiedź Skeeta już wyjaśnia, jak to zrobić. – tibtof

2

można użyć tego kodu.

DateTime dt1 = new DateTime(); 
DateTime dt2 = new DateTime(2012, 12, 25, 0, 0, 0, 0); 
int seconds=Seconds.secondsBetween(dt1, dt2).getSeconds(); 

int noOfDays=seconds/(24*60*60); 
int noOfHours=(seconds%(24*60*60))/(60*60); 
int noOfMinutes=((seconds%(24*60*60))%(60*60))/60; 
int noSec=((seconds%(24*60*60))%(60*60))%60; 

System.out.println("Time Left For christmas"); 
System.out.println("Days Left="+noOfDays+" Hours="+noOfHours+" Minutes="+noOfMinutes+" Seconds="+noSec); 
Powiązane problemy