2011-10-28 15 views
18

Chciałbym uzyskać aktualną datę w milisekundach tylko z rokiem, miesiącem i datą. Ale kiedy używam tego kodu:Kalendarz Java pobiera aktualną datę, bez godzin, minut, sekund i milisekund, w milisekundach

Calendar cal = Calendar.getInstance(); 
cal.clear(Calendar.HOUR); 
cal.clear(Calendar.MINUTE); 
cal.clear(Calendar.SECOND); 
cal.clear(Calendar.MILLISECOND); 
currentDate = cal.getTimeInMillis(); 

Nadal dostaję czas w milisekundach z godziną. Jak mogę to naprawić?

// André

Odpowiedz

39
Calendar cal = Calendar.getInstance(); 
cal.set(Calendar.HOUR_OF_DAY, 0); 
cal.set(Calendar.MINUTE, 0); 
cal.set(Calendar.SECOND, 0); 
cal.set(Calendar.MILLISECOND, 0); 
currentDate = cal.getTimeInMillis(); 

Be ostrożnie w strefie czasowej swojego kalendarza.

+0

dzięki, to się udało! –

+0

@just_user to popraw odpowiedź ... – Fred

+0

na Androidzie dałem mi wczoraj (północ) – Anthony

5

z javadoc: HOUR_OF_DAY, godzina i AM_PM pola są obsługiwane niezależnie, a reguła rozdzielczość dla pory dnia jest stosowana. Wyczyszczenie jednego z pól nie powoduje zresetowania wartości godziny tego kalendarza. Użyj zestawu (Calendar.HOUR_OF_DAY, 0), aby zresetować wartość godziny.

cal.set(Calendar.HOUR, 0); 
cal.set(Calendar.MINUTE, 0); 
cal.set(Calendar.SECOND, 0); 
cal.set(Calendar.MILLISECOND, 0); 

może trzeba ustawić AM/PM, a także

+0

Am/PM - dlatego używasz Calendar.HOUR_OF_DAY jak w innym przykładzie: – Mifune

8

Jeśli chcesz tylko ten w stosunku do GMT i wyraźnie po prostu chcą milisekund, można użyć to:

long now = System.currentTimeMillis(); 
long today = now - now % 86400000; 
1

tl; dr

LocalDate.now() 

LocalDate

Jeśli to, co chcesz, jest właściwie tylko datę bez czasu, użyj LocalDate klasę.

Klasa LocalDate reprezentuje wartość tylko dla daty bez pory dnia i bez strefy czasowej.

Strefa czasowa ma kluczowe znaczenie przy ustalaniu daty. W danym momencie data zmienia się na całym świecie według strefy. Na przykład kilka minut po północy w Paris France jest nowy dzień, a jednocześnie "wczoraj" w Montréal Québec.

Określ proper time zone name w formacie continent/region, takich jak America/Montreal, Africa/Casablanca lub Pacific/Auckland. Nigdy nie używaj skrótu 3-4-literowego, takiego jak EST lub IST, ponieważ są one rzeczywistymi strefami czasowymi, nie są standaryzowane, a nawet unikalne (!).

ZoneId z = ZoneId.of("America/Montreal"); 
LocalDate today = LocalDate.now(z); 

ZonedDateTime

Jeśli chcesz randkę z dnia pomiaru czasu ustawionym na pierwszej chwili dnia, prosić java.time aby określić ten moment dla ciebie. Nie zakładaj, że pierwsza chwila to 00:00:00. Anomalie, takie jak czas letni, oznaczają, że pierwsza chwila może nastąpić w innym czasie, na przykład 01:00:00.

Użyj tego obiektu strefy czasowej, ZoneId, aby wygenerować obiekt ZonedDateTime.

ZonedDateTime zdt = today.atStartOfDay(z); // Determine the first moment of the day on this date for this time zone. 

Aby zobaczyć tę samą chwilę jako wartość w UTC, wyodrębnić Instant obiekt.

Instant instant = zdt.toInstant(); 

Unikaj starszych klas date-time

uniknąć kłopotliwych starych klas Date-Time, takich jak Calendar. Są one teraz starsze, wyparte przez klasy java.time.


O java.time

Ramy java.time jest wbudowana w Java 8 i późniejszych. Klasy te zastępują kłopotliwe stare klasy z datami, takie jak java.util.Date, Calendar, & SimpleDateFormat.

Projekt Joda-Time, teraz w maintenance mode, zaleca migrację do klas java.time. Aby uzyskać więcej informacji, zobacz

. I wyszukaj Stack Overflow dla wielu przykładów i objaśnień. Specyfikacja to JSR 310.

Gdzie można uzyskać lekcje java.time?

Projekt ThreeTen-Extra rozciąga java.time z dodatkowych zajęć. Ten projekt jest poligonem wskazującym na możliwe przyszłe dodatki do java.time. Możesz znaleźć tutaj kilka użytecznych klas, takich jak Interval, YearWeek, YearQuarter i more.

Powiązane problemy