Informacje o czasie granicznym daty Java

121

Mam obiekt Java Date zawierający informacje o dacie i godzinie. Chcę napisać metodę, która odcina informacje o czasie, skraca godziny-minuty-sekundy, więc została mi tylko data.

Przykładowe dane wejściowe:

2008-01-01 13:15:00

Oczekiwany wynik:

2008-01-01 00:00:00

Masz wskazówkę? Próbowałem zrobić coś takiego:

(timestamp / (24 * 60 * 60 * 1000)) * (24 * 60 * 60 * 1000)

ale napotkałem problemy ze strefą czasową.

Marco
źródło

Odpowiedzi:

178

Zalecany sposób na manipulowanie data / czas jest użycie Calendarobiektu:

Calendar cal = Calendar.getInstance(); // locale-specific
cal.setTime(dateObject);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
long time = cal.getTimeInMillis();
cletus
źródło
2
@cletus, Czy można usunąć czas z obiektu Date. Chcę czystej daty, takiej jak 2008-01-01, bez części czasu.
Prem
2
Nie powiedziałbym, że java.util.Calendar jest zalecane. Firma Sun / Oracle wyparła tę klasę w Javie 8 nowym pakietem java.time. Użyj albo tego, albo Joda-Time.
Basil Bourque
3
Kalendarz nie jest już zalecany. Zobacz stackoverflow.com/a/28868089/40064, jeśli używasz języka Java 8.
Wim Deblauwe,
2
FYI, kłopotliwe stare klasy daty i czasu, takie jak java.util.Calendarobecnie starsze , zastąpione przez klasy java.time . Zobacz samouczek firmy Oracle .
Basil Bourque
148

Czy spojrzałeś na metodę obcinania DateUtils w Apache Commons Lang?

Date truncatedDate = DateUtils.truncate(new Date(), Calendar.DATE);

usunie element czasu.

JESTEM
źródło
9
Zaktualizowany link ponownie (chodź, Apache! Przestań przenosić swoje dokumenty!)
Ogre Psalm33
6
Minusem tego podejścia jest to, że strefa czasowa, w której wykonywana jest operacja obcięcia, jest zawsze strefą czasową lokalnego komputera. Więc jeśli pracujesz z kalendarzem i datami w strefie czasowej UTC lub w innej strefie czasowej niż lokalna strefa czasowa - może to spowodować obcięcie daty niezgodnie z przeznaczeniem.
Cloud
jak zauważył @Cloud, fakt, że nie widzę tutaj instancji Kalendarza (nie mam nad nią kontroli), trochę mnie denerwuje :)
Jaroslav Záruba
Ta metoda jest zaskakująco długa i miała co najmniej dwie poprawki błędów.
Pino
42

Spojrzałeś na Jodę ? To znacznie łatwiejszy i bardziej intuicyjny sposób pracy z datami i godzinami. Na przykład możesz konwertować trywialnie między (powiedzmy) obiektami LocalDateTime i LocalDate .

np. (aby zilustrować API)

LocalDate date = new LocalDateTime(milliseconds).toLocalDate()

Dodatkowo rozwiązuje niektóre problemy z bezpieczeństwem wątków z formatami daty / czasu i jest zdecydowanie zalecany do pracy z wszelkimi problemami z datą / godziną w Javie.

Brian Agnew
źródło
12
Myślę, że tak. Zaleca się korzystanie z lepszej biblioteki zamiast walki z uszkodzonymi klasami java.util (o czym świadczy pytanie)
Brian Agnew,
10
Oczywiście, Joda jest biblioteką do manipulacji datą, czasem i kalendarzem w Javie. Nie polecanie tego byłoby zaniedbaniem z obowiązku.
Joel
1
Problem z bezpieczeństwem wątków jest bardzo interesujący, znalazłem ten post, w którym badałem błąd Oracle / Hibernate „IllegalArgumentException, sun.util.calendar.ZoneInfo.getOffset (ZoneInfo), oracle.jdbc.driver.DateCommonBinder.zoneOffset (OraclePreparedStatement)”. To mówi o innych problemach Oracle, które pojawiają się tylko na forums.oracle.com/forums/thread.jspa?threadID=325576 Naprawdę trudno jest nawet utworzyć obiekt z nieprawidłowymi milisekundami w normalnym kodzie. Jeśli chodzi o mnie, myślę, że w swoim wątku poddam się za pomocą Jody, zamiast pozwolić Oracle na użycie potencjalnie podejrzanych rzeczy innych niż joda.
Mark Bennett
4
Chciałbym móc zagłosować w dół każdemu, kto to głosował. Kim są te wszystkie osoby, które dają +1 odpowiedzi, która nawet nie próbuje odpowiedzieć na pytanie? Odpowiedź przy użyciu Jody byłaby więcej niż mile widziana, ale to nie jest to ...
Ryan
1
@Ryan Dlaczego ta odpowiedź jest nieistotna? Pytanie zadane o datę bez godziny. Ta odpowiedź przedstawia zajęcia, których jedynym celem jest przedstawienie daty bez pory dnia.
Basil Bourque
35

Tylko szybka aktualizacja w świetle klas java.time wbudowanych teraz w Javę 8 i nowszą.

LocalDateTimema truncatedTometodę, która skutecznie rozwiązuje to, o czym tutaj mówisz:

LocalDateTime.now().truncatedTo(ChronoUnit.MINUTES)

To wyrazi aktualny czas tylko do minut:

2015-03-05T11:47

Możesz użyć ChronoUnit(lub a TemporalUnit) mniejszego niż DAYS do wykonania obcięcia (ponieważ obcięcie jest stosowane tylko do części czasu LocalDateTime, a nie do części daty).

Adam Berry
źródło
3
Możesz używać ChronoUnits tylko do DAYS - wyższe jednostki rzucą wyjątek.
assylias
26
Date date = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
date = cal.getTime();
drganie
źródło
22

Z Jodą możesz łatwo uzyskać oczekiwany termin.

Od wersji 2.7 (być może od jakiejś poprzedniej wersji wyższej niż 2.2), jak zauważa komentator, toDateMidnightzostał uznany za przestarzały na korzyść lub trafnie nazwany withTimeAtStartOfDay(), co czyni wygodnym

DateTime.now().withTimeAtStartOfDay()

możliwy.

Dodana korzyść w postaci ładniejszego API.

Ze starszymi wersjami możesz to zrobić

new DateTime(new Date()).toDateMidnight().toDate()
h7r
źródło
6
Metody i klasy związane z północą w Joda-Time są teraz przestarzałe. Twórcy odradzają ich używanie. Zamiast tego użyj metody withTimeAtStartOfDay.
Basil Bourque
Dziękuję za wskazanie. Zaktualizowałem odpowiedź, aby to rozważyć.
h7r
Możesz również użyć, toLocalDateaby uzyskać obiekt, który nie ma nawet składnika czasu.
Charles Wood
FYI, projekt Joda-Time jest teraz w trybie konserwacji , a zespół doradza migrację do klas java.time . Zobacz samouczek firmy Oracle .
Basil Bourque
8

Zrobiłem obcięcie z nowym API java8. Spotkałem się z jedną dziwną rzeczą, ale ogólnie jest okrojona ...

Instant instant = date.toInstant();
instant = instant.truncatedTo(ChronoUnit.DAYS);
date = Date.from(instant);
Sergio Kosik
źródło
słowa kluczowe: java.time, Java 8, LocalDateTime.truncatedTo ()
Alexander Taylor
1
Ta odpowiedź tworzy tylko daty dla kontekstu strefy czasowej UTC.
Basil Bourque
6

Użyj DateUtils z Apache, z obcięciem, w ten sposób:

DateUtils.truncate(Calendar.getInstance().getTime(), Calendar.DATE);
Byron Marambio Troncoso
źródło
Spowoduje to obcięcie w lokalnej strefie TimeZone, a nie w czasie UTC, który reprezentuje Date (getTime).
epoks
6

W przypadku sygnatur czasowych:

timestamp -= timestamp % (24 * 60 * 60 * 1000)
Gan Quan
źródło
3
W tym kodzie jest mały błąd - lewy nawias jest nieprawidłowo umieszczony, musi to być timestamp - = timestamp% (24 * 60 * 60 * 1000). To odetnie część czasu. Jestem pewien, że ten sposób jest bardziej wystarczający niż tworzenie obiektu Caledar i zabawa z jego metodami, a nawet korzystanie z innych bibliotek zewnętrznych
Stan
2
Nie, to NIE jest właściwe rozwiązanie, UWAŻAJ. Jest to to samo, co zaokrąglenie wartości daty do wartości minimalnej, to znaczy - możesz otrzymać datę 28 marca dla znacznika czasowego 29 marca (w Twoim języku). Tak więc rozwiązania oparte na kalendarzu (Apache's DateUtils również używa Kalendarza) to jedyny sposób
Drew
To również nie zadziała, gdy zmieni się czas z powodu czasu letniego.
Alexandru Severin
5

Z java.util.Date JavaDocs:

Klasa Date reprezentuje określony moment w czasie z dokładnością do milisekund

i z java.sql.Date JavaDocs:

Aby zachować zgodność z definicją SQL DATE, wartości milisekund opakowane przez instancję java.sql.Date muszą zostać „znormalizowane” przez ustawienie godzin, minut, sekund i milisekund na zero w określonej strefie czasowej, z którą jest skojarzona instancja. .

Dlatego najlepszym podejściem jest użycie java.sql.Date, jeśli nie potrzebujesz części czasu

java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());

a wynik to:

java.util.Date : Thu Apr 26 16:22:53 PST 2012
java.sql.Date  : 2012-04-26
Sunil Manheri
źródło
4

tl; dr

LocalDateTime.parse(                            // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
    "2008-01-01 13:15:00".replace( " " , "T" )  // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate()                                  // Extract a date-only value.
.atStartOfDay(                                  // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
    ZoneId.of( "Europe/Paris" )                 // Determining a specific start-of-day requires a time zone.
)                                               // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.toString()                                     // Generate a String in standard ISO 8601 format, wisely extended to append the name of the time zone in square brackets.

2008-01-01T00: 00 + 01: 00 [Europa / Paryż]

Aby wygenerować ciąg w żądanym formacie, przekaż plik DateTimeFormatter.

LocalDateTime.parse(                            // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
    "2008-01-01 13:15:00".replace( " " , "T" )  // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate()                                  // Extract a date-only value.
.atStartOfDay(                                  // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
    ZoneId.of( "Europe/Paris" )                 // Determining a specific start-of-day requires a time zone.
)                                               // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.format(                                        // Generate a String representing the object’s value.
    DateTimeFormatter.ISO_LOCAL_DATE_TIME       // Built-in predefined formatter close to what you want. 
)
.replace( "T" , " " )                           // Replace the standard’s use of a 'T' in the middle with your desired SPACE character.

2008-01-01 00:00:00

Detale

Inne odpowiedzi są poprawne, ale używaj starych klas daty i czasu, które są obecnie przestarzałe przez strukturę java.time.

java.time

Struktura java.time jest wbudowana w Javę 8 i nowsze. Znaczna część funkcjonalności java.time jest przenoszona z powrotem do Java 6 i 7 ( ThreeTen-Backport ) i dalej dostosowywana do Androida ( ThreeTenABP ).

Najpierw zmień ciąg wejściowy, aby był zgodny z kanoniczną wersją formatu ISO 8601. Standardowe formaty ISO 8601 są używane domyślnie w klasach java.time do analizowania / generowania łańcuchów reprezentujących wartości daty i godziny. Musimy zastąpić tę SPACJĘ w środku a T.

String input = "2008-01-01 13:15:00".replace( " " , "T" );  // → 2008-01-01T13:15:00

Teraz możemy go przeanalizować jako LocalDateTime, gdzie „Lokalny” oznacza brak określonej lokalizacji. Dane wejściowe nie zawierają żadnych informacji o przesunięciu względem czasu UTC ani o strefie czasowej.

LocalDateTime ldt = LocalDateTime.parse( input );

ldt.toString ()… 2008-01-01T13: 15: 00

Jeśli nie interesuje Cię pora dnia ani strefa czasowa, przekonwertuj na plik LocalDate.

LocalDate ld = ldt.toLocalDate();

ld.toString ()… 2008-01-01

Pierwsza chwila dnia

Jeśli zamiast tego chcesz, aby godzina była ustawiona na pierwszą porę dnia, użyj ZonedDateTimeklasy, a następnie przekonwertuj na LocalDateobiekt, aby wywołać jego atStartOfDaymetodę. Należy pamiętać, że pierwsza chwila może nie 00:00:00nadejść z powodu czasu letniego lub innych anomalii.

Strefa czasowa ma kluczowe znaczenie, ponieważ w dowolnym momencie data różni się na całym świecie według strefy. Na przykład, kilka chwil po północy w Paryżu to nowy dzień dla paryżan, ale dla Kanadyjczyków wciąż jest to „wczoraj” w Montrealu.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );
LocalDate ldFromZdt = zdt.toLocalDate();
ZonedDateTime zdtStartOfDay = ldFromZdt.atStartOfDay( zoneId );

zdtStartOfDay.toString ()… 2008-01-01T00: 00: 00-05: 00 [Ameryka / Montreal]

UTC

Aby zobaczyć ten moment przez pryzmat strefy czasowej UTC , wyodrębnij Instantobiekt. Zarówno ZonedDateTimei, jak i Instantbędą reprezentować ten sam moment na osi czasu, ale pojawią się jako dwa różne czasy na zegarze ściennym .

An Instantjest podstawową klasą bloków konstrukcyjnych w java.time, z definicji zawsze w UTC. Używaj tej klasy często, ponieważ generalnie powinieneś wykonywać logikę biznesową, przechowywanie danych i wymianę danych w UTC.

Instant instant = zdtStartOfDay.toInstant();

instant.toString ()… 2008-01-01T05: 00: 00Z

Widzimy 5 rano zamiast wybicia północy. W standardowym formacie, Zna końcu jest skrótem Zului oznacza „UTC”.


Informacje o java.time

Struktura java.time jest wbudowana w Javę 8 i nowsze. Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak java.util.Date, Calendar, i SimpleDateFormat.

Projekt Joda-Time , obecnie w trybie konserwacji , zaleca migrację do klas java.time .

Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj Stack Overflow, aby znaleźć wiele przykładów i wyjaśnień. Specyfikacja to JSR 310 .

Możesz wymieniać obiekty java.time bezpośrednio ze swoją bazą danych. Użyj sterownika JDBC zgodnego z JDBC 4.2 lub nowszym. Nie ma potrzeby stosowania ciągów ani java.sql.*klas.

Skąd wziąć klasy java.time?

  • Java SE 8 , Java SE 9 i nowsze
    • Wbudowany.
    • Część standardowego interfejsu API języka Java z dołączoną implementacją.
    • Java 9 dodaje kilka drobnych funkcji i poprawek.
  • Java SE 6 i Java SE 7
    • Wiele funkcji java.time jest przenoszonych z powrotem do Java 6 i 7 w ThreeTen-Backport .
  • Android
    • Późniejsze wersje implementacji klas java.time w pakietach Androida.
    • Dla wcześniejszej Androida (<26), ThreeTenABP projekt dostosowuje ThreeTen-backportu (jak wyżej). Zobacz Jak używać ThreeTenABP… .

Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak Interval, YearWeek, YearQuarter, i więcej .

Basil Bourque
źródło
2

Użyj metody klasy Calendar , set()aby ustawić pola HOUR_OF_DAY, MINUTE, SECONDi MILLISECONDna zero.

Michael Borgwardt
źródło
2

Pytanie jest sprzeczne. Pyta o datę bez godziny, ale wyświetla przykład z godziną 00:00:00.

Joda-Time

AKTUALIZACJA: Projekt Joda-Time jest teraz w trybie konserwacji , a zespół zaleca migrację do klas java.time . Zobacz moją drugą odpowiedź dotyczącą rozwiązania java.time.

Jeśli zamiast tego chcesz ustawić porę dnia na pierwszą porę dnia, użyj DateTimeobiektu w bibliotece Joda-Time i wywołaj jego withTimeAtStartOfDaymetodę. Należy pamiętać, że pierwsza chwila może nie 00:00:00nadejść z powodu czasu letniego lub innych anomalii.

Basil Bourque
źródło
To jest ostateczna odpowiedź (zakładając, że można i chce się używać czasu Joda)
Clint Eastwood
2

Tylko clear()zbędne pola.

Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.clear(Calendar.MINUTE);
calendar.clear(Calendar.SECOND);
calendar.clear(Calendar.MILLISECOND);
Date truncatedDate = calendar.getTime();

Od Java 8 lepszym rozwiązaniem jest użycie truncatedTometody LocalDateTimenp:

LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)
m190
źródło
To nie działa, ponieważ calendar.clear(Calendar.HOUR_OF_DAY);nie odlicza godzin. Rozwiązanie z @cletus działa OK.
Arcao
Przepraszam, masz rację, poprawiłem to, przez godziny należy ustawić wartość. Generalnie to prawie tak samo jak skracanie daty ...
m190
1

Naprawdę zirytowało mnie to, że nowy „ulepszony” konstruktor kalendarza nie przyjmuje int przez milisekundy, jak „okropny” stary Date one. Wtedy naprawdę się zdenerwowałem i napisałem to:

long stuffYou = startTime.getTimeInMillis() % 1000;
startTime.setTimeInMillis(startTime.getTimeInMillis() - stuffYou);

Nie użyłem wtedy słowa „rzeczy”, ale potem odkryłem szczęście:

startTime.set(Calendar.MILLISECOND, 0);

Ale nadal jestem z tego powodu zły.

Dave
źródło
1

Rozwiązałem problem w ten sposób (w ósmej strefie wschodniej (czas pekiński)):

private Date getTruncatedDate(Date d) {
    if (d == null) {
        return null;
    }
    long h = 60 * 60 * 1000L;
    long dateStamp = d.getTime() - (d.getTime() + 8 * h) % (24 * h);
    return new Date(dateStamp);
}

Przede wszystkim powinieneś wiedzieć, co to jest znacznik czasu. Znacznik czasu to całkowita liczba milisekund od 01 stycznia 00:00:00 1970 GMT (tak samo jak UTC) lub od czwartku 01 stycznia 08:00:00 CST 1970 do teraz.

Pamiętaj: znacznik czasu jest niezależny od strefy czasowej.

Tak więc otrzymujesz ten sam wynik z poniższą instrukcją w różnych strefach czasowych:

System.out.println(new Date().getTime());

I

System.out.println(new Date(0));

wyświetla różne informacje o czasie w różnych strefach czasowych: jeśli ustawisz strefę czasową swojego komputera na UTC, otrzymasz

Thu Jan 01 00:00:00 UTC 1970

Ale jeśli ustawisz strefę czasową na (UTC +8: 00) Beijing, Chongqing, HongKong, Urumq, otrzymasz:

Thu Jan 01 08:00:00 CST 1970

Java pobiera sygnaturę czasową, a następnie wyświetla informacje o dacie i godzinie według strefy czasowej.

Aby dowiedzieć się, jak Java wyświetla informacje o dacie i godzinie w różnych strefach czasowych, sposób transkacji informacji o czasie jest łatwy. Powinieneś otrzymać sygnaturę czasową i wziąć pod uwagę strefę czasową, gdy odcinasz informacje o czasie. Następnie możesz utworzyć nowy obiekt Date z wyciętym znacznikiem czasu (możemy to nazwać datownikiem), java skompensuje strefę czasową, gdy wyświetla informacje o dacie.

Podobnie jak w ósmej strefie wschodniej (czas pekiński), czas w Pekinie jest wcześniejszy o 8 godzin niż GMT, więc podczas wykonywania operacji modulo należy odjąć więcej 8 godzin. Oznacza to, że najpierw powinieneś uzyskać czas GMT, a następnie Java doda 8 godzin do czasu wyświetlania w oparciu o ustawienie strefy czasowej komputera.


Kwestia strefy czasowej jest niejasna i przez długi czas mnie intryguje. Teraz wyjaśniam to jasno. Nadzieja pomaga.


2018-01-04 Działa również poniższa metoda.

private Date getTruncatedDate2(Date d) {
    Calendar cal = Calendar.getInstance(); // locale-specific
    cal.setTime(d);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);


return cal.getTime();

}

Gelbert
źródło
FYI, ta odpowiedź używa kłopotliwych starych klas daty i czasu, które lata temu zostały zastąpione przez klasy java.time .
Basil Bourque
1

Możesz to zrobić, aby uniknąć problemów ze strefą czasową:

public static Date truncDate(Date date) {
    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
    cal.setTime(date);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    return cal.getTime();
}

Chociaż Dateobiekt Java jest wartością znacznika czasu, ale podczas obcięcia zostanie przekonwertowany na lokalną strefę czasową, więc uzyskasz zaskakującą wartość, jeśli spodziewasz się wartości ze strefy czasowej UTC.

GMsoF
źródło
Kłopotliwe Calendari Dateklasy stały się starsze lata temu wraz z klasami java.time implementującymi JSR 310 w Javie 8 i nowszych. Sugerowanie ich użycia w 2018 roku to kiepska rada.
Basil Bourque
0

Może to być spóźniona odpowiedź, ale oto sposób na zrobienie tego w jednej linii bez korzystania z żadnych bibliotek:

new SimpleDateFormat("yyyy-MM-dd").parse(new SimpleDateFormat("yyyy-MM-dd").format(YOUR_TIMESTAMP))
Alex
źródło
0

Z Joda-Time od wersji 2.0 możesz używać LocalDate.toDate().

Po prostu

// someDatetime is whatever java.util.Date you have.
Date someDay = new LocalDate(someDatetime).toDate();
lamusique
źródło
[A] Twoja odpowiedź jest zbędna. Już opublikowane przez Briana Agnewa . [B] Twój kod jest nieprawidłowy, ponieważ ignoruje strefę czasową, samą kwestię poruszoną w pytaniu.
Basil Bourque,
Może być zbędny, ale podałem tutaj prostszy przykład, ponieważ uznałem, że odpowiedź nie powinna znajdować się w komentarzach. Tak, java.util.Date ignoruje TimeZone, ale pierwotne pytanie było z, a Java Date objectwięc użyłem java.util.Date. Co więcej, nie wyjaśnia, dlaczego jego strefa czasowa jest problematyczna z java.util.Date (kiedy? Gdzie?), Chociaż nie może pomóc w korzystaniu z innego niż Date.
lamusique
0

W przypadku wszystkich odpowiedzi korzystających z Kalendarza powinieneś używać go w ten sposób

public static Date truncateDate(Date date) {
    Calendar c = Calendar.getInstance();
    c.setTime(date);
    c.set(Calendar.HOUR_OF_DAY, c.getActualMinimum(Calendar.HOUR_OF_DAY));
    c.set(Calendar.MINUTE, c.getActualMinimum(Calendar.MINUTE));
    c.set(Calendar.SECOND, c.getActualMinimum(Calendar.SECOND));
    c.set(Calendar.MILLISECOND, c.getActualMinimum(Calendar.MILLISECOND));
    return c.getTime();
}

Ale wolę to:

public static Date truncateDate(Date date) {
    return new java.sql.Date(date.getTime());
}
Gość
źródło
java.sql.DateKlasa udaje reprezentować wartości daty-ale tylko faktycznie ma time-of-day skorygowanej o UTC strefy czasowej. Więc nie jest to właściwe rozwiązanie tego pytania.
Basil Bourque
0

Oto prosty sposób na uzyskanie daty bez godziny, jeśli używasz języka Java 8+: użyj typu java.time.LocalDate zamiast Date.

LocalDate now = LocalDate.now();
 System.out.println(now.toString());

Wyjście:

2019-05-30

https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html

Amy Doxy
źródło
1
Korzystanie LocalDatejest dobrym pomysłem dla większości zastosowań, ale nie wiadomo, jak to będzie działać z wejściem z pytaniem 2008-01-01 13:15:00.
Ole VV