Wie erstelle ich ein Java Date-Objekt von Mitternacht heute und Mitternacht morgen?


178

In meinem Code muss ich alle meine Dinge finden, die heute passiert sind. Ich muss mich also mit Daten von heute um 00:00 Uhr (Mitternacht am frühen Morgen) bis 12:00 Uhr (Mitternacht heute Abend) vergleichen.

Ich weiß ...

Date today = new Date(); 

... holt mich jetzt. Und ...

Date beginning = new Date(0);

... bringt mir am 1. Januar 1970 keine Zeit. Aber was ist ein einfacher Weg, um heute null Zeit und morgen null Zeit zu bekommen?

AKTUALISIEREN; Ich habe das getan, aber es gibt doch einen einfacheren Weg?

Calendar calStart = new GregorianCalendar();
calStart.setTime(new Date());
calStart.set(Calendar.HOUR_OF_DAY, 0);
calStart.set(Calendar.MINUTE, 0);
calStart.set(Calendar.SECOND, 0);
calStart.set(Calendar.MILLISECOND, 0);
Date midnightYesterday = calStart.getTime();

Calendar calEnd = new GregorianCalendar();
calEnd.setTime(new Date());
calEnd.set(Calendar.DAY_OF_YEAR, calEnd.get(Calendar.DAY_OF_YEAR)+1);
calEnd.set(Calendar.HOUR_OF_DAY, 0);
calEnd.set(Calendar.MINUTE, 0);
calEnd.set(Calendar.SECOND, 0);
calEnd.set(Calendar.MILLISECOND, 0);
Date midnightTonight = calEnd.getTime();

3
Meiner Meinung nach ist Joda Time einfacher, schauen Sie sich das Ende meiner Antwort an. Wenn Sie java.util.Date/Calendar verwenden möchten, müssen Sie dies auf diese Weise tun. Es gibt keinen einfacheren Weg, dies zu tun.
Timaschew

RE: Timaschew-Kommentar zur Verwendung von Joda-Time, wissen, dass sich das Joda-Time-Projekt jetzt im Wartungsmodus befindet, und empfiehlt die Migration zu den Klassen java.time.
Basil Bourque

1
Zu Ihrer Information, die furchtbar lästig alten Datum Zeitklassen wie java.util.Date, java.util.Calendarund java.text.SimpleDateFormatsind jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 und höher. Siehe Tutorial von Oracle .
Basil Bourque

2
Es gibt selten so viele fehlerhafte Antworten auf eine Frage wie auf diese. Ich empfehle die Antwort von Basil Bourque , sie ist richtig und kenntnisreich.
Ole VV

Antworten:


344

java.util.Calendar

// today    
Calendar date = new GregorianCalendar();
// reset hour, minutes, seconds and millis
date.set(Calendar.HOUR_OF_DAY, 0);
date.set(Calendar.MINUTE, 0);
date.set(Calendar.SECOND, 0);
date.set(Calendar.MILLISECOND, 0);

// next day
date.add(Calendar.DAY_OF_MONTH, 1);

JDK 8 - java.time.LocalTime und java.time.LocalDate

LocalTime midnight = LocalTime.MIDNIGHT;
LocalDate today = LocalDate.now(ZoneId.of("Europe/Berlin"));
LocalDateTime todayMidnight = LocalDateTime.of(today, midnight);
LocalDateTime tomorrowMidnight = todayMidnight.plusDays(1);

Joda-Zeit

Wenn Sie ein JDK <8 verwenden, empfehle ich Joda Time , da die API wirklich gut ist:

DateTime date = new DateTime().toDateMidnight().toDateTime();
DateTime tomorrow = date.plusDays(1);

Seit der Version 2.3 von Joda Zeit DateMidnightist veraltet , das so verwenden:

DateTime today = new DateTime().withTimeAtStartOfDay();
DateTime tomorrow = today.plusDays(1).withTimeAtStartOfDay();

Übergeben Sie eine Zeitzone, wenn Sie die aktuelle Standardzeitzone der JVM nicht möchten.

DateTimeZone timeZone = DateTimeZone.forID("America/Montreal");
DateTime today = new DateTime(timeZone).withTimeAtStartOfDay(); // Pass time zone to constructor.

Vielen Dank für die Hilfe, ich hatte gerade meine ursprüngliche Frage mit dem aktuellen Stand aktualisiert. Danke für den Vorschlag.

3
Ab JodaTime 2.3 toDateMidnightist veraltet. Siehe diese Antwort für Details: stackoverflow.com/a/19048833/363573
Stephan

fügte eine Lösung für JDK 8 hinzu
timaschew

1
@timaschew Obwohl dies im Allgemeinen korrekt ist, empfehle ich, die java.time mit einem in Zonen aufgeteilten Datum-Uhrzeit-Wert ( ZonedDateTime) durchzuführen, wie Sie es im Abschnitt Joda-Time getan haben. Die Local…Typen haben keine Zeitzoneninformationen - das ist ihr gesamter Zweck, kein Verlust / Ignorieren aller Versatz- und Zeitzonendetails. Insbesondere wenn in der Frage über die Verwendung dieser Werte zum Vergleich gesprochen wird (möglicherweise Datenbankabfragen?), Ist ein in Zonen aufgeteilter Wert für Datum und Uhrzeit wahrscheinlich nützlicher.
Basil Bourque

1
@Amalgovinus Stellen Sie sicher, dass Calendar.HOUR_OF_DAY und nicht Calendar.HOUR festgelegt ist.
Oswald

42

Der Vollständigkeit halber können Sie bei Verwendung von Java 8 auch die truncatedToMethode der InstantKlasse verwenden, um Mitternacht in UTC zu erhalten .

Instant.now().truncatedTo(ChronoUnit.DAYS);

Wie im Javadoc geschrieben

Wenn Sie beispielsweise mit der MINUTES-Einheit abschneiden, wird auf die nächste Minute gerundet, und die Sekunden und Nanosekunden werden auf Null gesetzt.

Ich hoffe es hilft.


1
Danke für den Tipp. Das Date.from(date.toInstant().atZone(ZoneId.systemDefault()).truncatedTo(ChronoUnit.DAYS).toInstant())
Erreichen


33

Der einfachste Weg, um Mitternacht zu finden:

Long time = new Date().getTime();
Date date = new Date(time - time % (24 * 60 * 60 * 1000));

Nächster Tag:

Date date = new Date(date.getTime() + 24 * 60 * 60 * 1000);

Ich lief diesen Code und bekam: Mitternacht: Do 01. November 19:00:00 CDT 2012
Dave

3
Wenn Sie so etwas wie System.out.print (Datum) ausgeführt haben, hat das System die Datumsinstanz in die Systemzeitzone (CDT) konvertiert. 19 Uhr in CDT ist Mitternacht in GMT. Wenn Sie in einer ausgewählten Zeitzone Mitternacht benötigen, müssen Sie den Versatz dieser Zeitzone unter Berücksichtigung der Sommerzeit hinzufügen.
Andrei Volgin

@Bouncner Es ist. Es gibt viele verschiedene Mitternachtszeiten auf der Erde, unabhängig davon, welche Methode Sie verwenden, aber es gibt nur eine Java-Mitternacht.
Andrei Volgin

2
@Andrei Volgin Wusste nicht, dass es eine "Java Mitternacht" gibt. ;) Was ich sagen wollte ist, dass diese Lösung dem Themenersteller imo nicht wirklich hilft. Eine Kalenderlösung vermeidet hässliche Sekundenberechnungen und berücksichtigt bei ordnungsgemäßer Verwendung Zeitzonen (und insbesondere Sommerzeit usw.). Ich sehe das nicht in Ihrer Lösung.
Bouncner

Hallo @AndreiVolgin, ich habe mit Datum Datum = neues Datum (Zeit + ZeitZone.getDefault (). GetRawOffset () - Zeit% (24 * 60 * 60 * 1000));
jrey

28

Denken Sie daran, Datewird nicht verwendet, um Daten (!) Darzustellen. Zur Darstellung des Datums benötigen Sie einen Kalender. Dies:

Calendar c = new GregorianCalendar();

erstellt eine CalendarInstanz, die das aktuelle Datum in Ihrer aktuellen Zeitzone darstellt. Jetzt müssen Sie jedes Feld unterhalb des Tages (Stunde, Minute, Sekunde und Millisekunde) abschneiden, indem Sie es auf einstellen 0. Sie haben heute Mitternacht.

Um am nächsten Tag Mitternacht zu bekommen, müssen Sie einen Tag hinzufügen:

c.add(Calendar.DAY_OF_MONTH, 1);

Beachten Sie, dass das Hinzufügen von 86400Sekunden oder 24 Stunden aufgrund der Sommerzeit, die in der Zwischenzeit auftreten kann, falsch ist.

UPDATE: Meine bevorzugte Methode zur Lösung dieses Problems ist jedoch die Verwendung der DateUtils- Klasse von Commons Lang :

Date start = DateUtils.truncate(new Date(), Calendar.DAY_OF_MONTH))
Date end = DateUtils.addDays(start, 1);

Es verwendet Calendarhinter den Kulissen ...


15
Danke für die Hilfe. "Datum wird nicht verwendet, um Daten darzustellen" - wir werden das ziemlich verdammt brillant finden, nicht wahr? ;)

@RobertHume Um fair zu sein, gibt es Date seit der ersten Veröffentlichung von Java. Die meisten Dinge aus dieser Zeit sind ... weniger als perfekt durchdacht. Zumal Java zu den ersten gehörte, die die Art von Dingen ausprobierten, die es versuchte, und es gab bei weitem keinen vereinbarten Standard dafür.
Fund Monica Klage

14

Diese Methoden werden Ihnen helfen,

public static Date getStartOfDay(Date date) {
     Calendar calendar = Calendar.getInstance();
     calendar.setTime(date);
     calendar.set(Calendar.HOUR_OF_DAY, 0);
     calendar.set(Calendar.MINUTE, 0);
     calendar.set(Calendar.SECOND, 0);
     calendar.set(Calendar.MILLISECOND, 0);
     return calendar.getTime();
 }

und

public static Date getEndOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.set(Calendar.HOUR_OF_DAY, 23);
    calendar.set(Calendar.MINUTE, 59);
    calendar.set(Calendar.SECOND, 59);
    calendar.set(Calendar.MILLISECOND, 999);
    return calendar.getTime();
}

9

Ab JodaTime 2.3 ist das toDateMidnight()veraltet.

Vom Upgrade von 2.2 auf 2.3

    Abschreibungen seit 2.2
    ----------------------
    - DateMidnight [# 41]
     Diese Klasse ist konzeptionell fehlerhaft
     Die Mitternachtszeit tritt gelegentlich in einigen Zeitzonen nicht auf
     Dies ist das Ergebnis einer Sommerzeit von 00:00 bis 01:00 Uhr
     DateMidnight ist im Wesentlichen eine DateTime mit einer auf Mitternacht gesperrten Zeit
     Ein solches Konzept ist angesichts von LocalDate im Allgemeinen schlecht zu verwenden
     Ersetzen Sie DateMidnight durch LocalDate
     Oder ersetzen Sie es durch DateTime, möglicherweise mithilfe der withTimeAtStartOfDay () -Methode

Hier ist ein Beispielcode ohne toDateMidnight()Methode.

Code

DateTime todayAtMidnight = new DateTime().withTimeAtStartOfDay();
System.out.println(todayAtMidnight.toString("yyyy-MM-dd HH:mm:ss"));

Ausgabe ( kann je nach lokaler Zeitzone unterschiedlich sein )

2013-09-28 00:00:00

2
Hervorragende Antwort. Ich würde hinzufügen, eine DateTimeZoneInstanz an diesen DateTimeKonstruktor zu übergeben, um die Wichtigkeit der Angabe einer Zeitzone zu betonen, anstatt versehentlich abhängig von der Standardeinstellung:DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
Basil Bourque

8

Andere Antworten sind korrekt, insbesondere die Antwort java.time von arganzheng . Wie bereits erwähnt, sollten Sie die alten Klassen java.util.Date/.Calendar vermeiden, da sie schlecht gestaltet, verwirrend und problematisch sind. Sie wurden durch die Klassen java.time ersetzt.

Lassen Sie mich Anmerkungen zur Strategie für den Umgang mit Mitternacht und Zeitspannen hinzufügen .

Halb offen

Bei der Arbeit mit Datum und Uhrzeit werden Zeitspannen häufig mithilfe des „Half-Open“ -Ansatzes definiert. Bei diesem Ansatz ist der Anfang inklusive, während das Ende exklusiv ist . Dies löst Probleme und erleichtert bei konsequenter Verwendung das Nachdenken über Ihre Datums- und Uhrzeitbehandlung erheblich.

Ein gelöstes Problem ist die Definition des Tagesendes. Ist der letzte Moment des Tages 23:59:59.999( Millisekunden )? Vielleicht in der Klasse java.util.Date (vom frühesten Java; mühsam - vermeiden Sie diese Klasse!) Und in der äußerst erfolgreichen Joda-Time- Bibliothek. In anderen Programmen wie Datenbanken wie Postgres ist der letzte Moment jedoch 23:59:59.999999( Mikrosekunden ). In anderer Software wie dem java.time- Framework (integriert in Java 8 und höher, Nachfolger von Joda-Time) und in einigen Datenbanken wie der H2-Datenbank kann der letzte Moment jedoch 23:59.59.999999999( Nanosekunden ) sein. Anstatt Haare zu spalten, denken Sie nur an den ersten Moment, nicht an den letzten Moment.

Bei Half-Open läuft ein Tag vom ersten Moment eines Tages bis zum ersten Moment des folgenden Tages , schließt ihn jedoch nicht ein . Also anstatt so zu denken:

… Von heute um 00:00 Uhr (Mitternacht heute früh) bis 12:00 Uhr (Mitternacht heute Abend).

… Denk so…

vom ersten Moment des heutigen Tages bis zum ersten Moment von morgen:
(> = 00:00:00.0heute UND < 00:00:00.0morgen)

In der Datenbank arbeiten, bedeutet dieser Ansatz nicht die Verwendung von BETWEENOperator in SQL.

Tagesanfang

Darüber hinaus ist der erste Moment des Tages nicht immer die Tageszeit 00:00:00.0. Sommerzeit (DST) in einigen Zeitzonen und möglicherweise andere Anomalien können bedeuten, dass eine andere Zeit den Tag beginnt.

Lassen Sie also die Klassen java.time den Beginn eines Tages mit einem Aufruf von bestimmen LocalDate::atStartOfDay( ZoneId ). Wir müssen also durch LocalDateund zurück gehen, ZonedDateTimewie Sie in diesem Beispielcode sehen können.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
ZonedDateTime todayStart = now.toLocalDate().atStartOfDay( zoneId );
ZonedDateTime tomorrowStart = todayStart.plusDays( 1 );

Beachten Sie die Übergabe des optionalen ZoneId. Wenn nicht angegeben, wird die aktuelle Standardzeitzone Ihrer JVM implizit angewendet. Besser explizit sein.

Die Zeitzone ist für die Arbeit mit Datum und Uhrzeit von entscheidender Bedeutung. Die Frage und einige andere Antworten sind möglicherweise fehlerhaft, da die Zeitzone nicht bewusst behandelt wird.

Konvertieren

Wenn Sie müssen eine java.util.Date oder .Calendar verwenden, suchen Sie nach Methoden , um neue Umstellung auf die alten Klassen hinzugefügt.

java.util.Date utilDate = java.util.Date.from( todayStart.toInstant() );
java.util.GregorianCalendar gregCal = java.util.GregorianCalendar.from( todayStart );

Zeitspanne

Übrigens, wenn Sie viel mit Zeitspannen arbeiten, schauen Sie sich Folgendes an:

  • Duration
  • Period
  • Interval
    Die IntervalKlasse befindet sich im ThreeTen-Extra- Projekt, einer Erweiterung des Java.time-Frameworks. Dieses Projekt ist das Testfeld für mögliche zukünftige Ergänzungen von java.time.
    Interval todayMontreal = Interval.of( todayStart.toInstant() , tomorrowStart.toInstant() );

Über java.time

Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Legacy - Datum-Zeit - Klassen wie java.util.Date, Calendar, & SimpleDateFormat.

Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu den Klassen java.time .

Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .

Sie können java.time- Objekte direkt mit Ihrer Datenbank austauschen . Verwenden Sie einen JDBC-Treiber, der mit JDBC 4.2 oder höher kompatibel ist . Keine Notwendigkeit für Zeichenfolgen, keine Notwendigkeit für java.sql.*Klassen.

Woher bekomme ich die java.time-Klassen?

Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden Interval, YearWeek, YearQuarter, und mehr .


6

java.time

Wenn Sie Java 8 und höher verwenden, können Sie das Paket java.time ( Tutorial ) ausprobieren :

LocalDate tomorrow = LocalDate.now().plusDays(1);
Date endDate = Date.from(tomorrow.atStartOfDay(ZoneId.systemDefault()).toInstant());

2
Gute Antwort. Ich würde vorschlagen, die gewünschte / erwartete Zeitzone anzugeben. Die aktuelle Standardzeitzone der JVM kann je nach Betriebssystemeinstellungen, wechselnden Computern oder jeder App in einem beliebigen Thread der JVM variieren, wobei die Standardeinstellung jederzeit zur Laufzeit geändert wird.
Basil Bourque

4

Dies scheint eine Option zu sein:

DateFormat justDay = new SimpleDateFormat("yyyyMMdd");
Date thisMorningMidnight = justDay.parse(justDay.format(new Date()));

um auch einen Tag hinzuzufügen

Date tomorrow = new Date(thisMorningMidnight.getTime() + 24 * 60 * 60 * 1000);

oder

Calendar c = Calendar.getInstance();
c.setTime(thisMorningMidnight);
c.add(Calendar.DATE, 1);
Date tomorrowFromCalendar = c.getTime();

Ich habe eine Ahnung, dass Letzteres bevorzugt wird, wenn etwas Seltsames wie Sommerzeit dazu führt, dass das Hinzufügen von 24 Stunden nicht ausreicht (siehe https://stackoverflow.com/a/4336131/32453 und seine anderen Antworten).


Ich habe ein Datum und eine Uhrzeit in meiner SQLite-Datenbank als Long dargestellt. Ich muss lange auf den Anfang des nächsten Tages warten. Kann ich ein Date-Objekt weiterhin mit meinem Long-Objekt und nicht mit der oben verwendeten SimpleDateFormat-Methode verwenden?
AJW

1
Solange es die richtigen Millisekunden sind, können Sie es als Konstruktor übergeben: docs.oracle.com/javase/7/docs/api/java/util/…
Rogerdpack

1

Ich habe das anders gemacht als alle anderen hier. Ich bin neu in Java, daher ist meine Lösung möglicherweise schlecht.

Date now = new Date();
Date midnightToday = new Date(now.getYear(), now.getMonth(), now.getDate());

Ich bin mir noch nicht sicher, ob dies funktioniert, aber ich würde mich über jedes Feedback zu dieser Lösung freuen.

Ich bin verwirrt von der obigen Aussage, dass Sie morgen berechnen können, indem Sie anrufen:

c.add(Calendar.DAY_OF_MONTH, 1);

Wenn Sie dem Tag des Monats 1 hinzufügen und es der 31. Tag ist, erhalten Sie dann nicht den 32. Tag des Monats?

Warum basieren Zeiten / Daten nicht alle auf UTC in Java? Ich würde denken, dass Zeitzonen nur benötigt werden sollten, wenn sie mit E / A verwendet werden, aber intern sollten sie immer in UTC verwendet werden. Die Klassen scheinen jedoch Zeitzoneninformationen zu enthalten, die nicht nur verschwenderisch, sondern auch anfällig für Codierungsfehler sind.


2
Hallo Mitch. Ich denke, Ihre Lösung funktioniert, aber es sieht so aus, als ob der Date-Konstruktor veraltet ist. Die Java-Leute haben vor einiger Zeit die meisten der ursprünglichen datumsbezogenen Methoden abgelehnt und durch neuere kalenderbezogene Methoden ersetzt. Persönlich sehe ich keine Verbesserung, aber es ist verpönt, veraltete Methoden zu verwenden. Vielen Dank!

Traurig über die Abwertung. Es erscheint mir viel sauberer, Jahr, Monat und Datum anzugeben, anstatt Stunde, Minute, Sekunde und Millisekunden zu löschen. Um diese zu löschen, müssen Millisekunden die feinste Granularität der Date-Klasse sein, während meine Lösung dies nicht tut. Meine Lösung ist auch kürzer und klarer. Wenn ich neu in Java bin, weiß ich wirklich zu schätzen, wie sauber, einfach und effizient C ++ ist, wenn es um die Verwendung von Datum und Uhrzeit geht.
Mitch

@Mitch Nach meiner Erfahrung wird die aktuellste Sprache, die Sie lernen, immer als die komplizierteste angesehen.
ArtOfWarfare

Zu Ihrer Information: Diese verdammt schrecklichen alten Datums- und Uhrzeitklassen sind jetzt Vermächtnis und werden durch die modernen Java.time-Klassen ersetzt.
Basil Bourque


0

Der einfachste Weg mit JodaTime

DateMidnight date = DateMidnight.now();


2
Nein. Die mit "Mitternacht" zusammenhängenden Klassen und Methoden in Joda-Time sind alle veraltet. Sie basierten auf einem fehlerhaften Konzept. Der erste Moment des Tages ist nicht immer 00:00:00.000. Verwenden Sie stattdessen die neue withTimeAtStartOfDayMethode. Aktualisieren Sie auf die aktuelle Version 2.4 von Joda-Time und lesen Sie die Versionshinweise. Beispiel:DateTime today = DateTime.now( DateTimeZone.forID( "America/Montreal" ) ).withTimeAtStartOfDay();
Basil Bourque

0

Da ein Tag 24 * 60 * 60 * 1000ms ist, kann die Mitternacht dieses Tages berechnet werden als ...

long now = System.currentTimeMillis();
long delta = now % 24 * 60 * 60 * 1000;
long midnight = now - delta;
Date midnightDate = new Date(midnight);`

1
Dieser Code gilt nur für UTC und keine andere Zeitzone und ignoriert Anomalien wie die Sommerzeit. Darüber hinaus ist es unklug, eigene Datums- und Uhrzeitlösungen zu erstellen, da dies ein überraschend kniffliges Thema ist. Verwenden Sie stattdessen die hervorragenden Klassen java.time.
Basil Bourque

0

So ziemlich wie die Antworten zuvor, aber niemand erwähnte den AM_PM-Parameter:

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    cal.set(Calendar.AM_PM, Calendar.AM);

1
Die problematische CalendarKlasse wurde vor Jahren speziell durch die Klassen java.time ersetztZonedDateTime .
Basil Bourque

0
Date now= new Date();
// Today midnight
Date todayMidnight = new Date(endTime.getTime() -endTime.getTime()%DateUtils.MILLIS_PER_DAY);

// tomorrow midnight
Date tomorrowMidnight = new Date(endTime.getTime() -endTime.getTime()%DateUtils.MILLIS_PER_DAY + DateUtils.MILLIS_PER_DAY);

Dies funktioniert nur für UTC und adressiert keine Zeitzonen. Auch die schreckliche DateKlasse wurde vor Jahren von verdrängt java.time.Instant. Vermeiden Sie Dateheutzutage zu verwenden.
Basil Bourque

0

Verwenden von Apache Commons.

//For midnight today 
Date today = new Date(); 
DateUtils.truncate(today, Calendar.DATE);

//For midnight tomorrow   
Date tomorrow = DateUtils.addDays(today, 1); 
DateUtils.truncate(tomorrow, Calendar.DATE);

Zu Ihrer Information, die furchtbar lästig alten Datum Zeitklassen wie java.util.Date, java.util.Calendarund java.text.SimpleDateFormatsind jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 und höher. Siehe Tutorial von Oracle .
Basil Bourque

@BasilBourque Einverstanden für Java 8. Aber wenn OP Java 7 verwendet, würde das immer noch funktionieren.
Joe4java

Nahezu alle Funktionen von java.time sind für Java 6 und 7 im ThreeTen-Backport- Projekt mit praktisch identischer API verfügbar . Weiter angepasst für Android <26 im ThreeTenABP- Projekt. Sie müssen diese elenden alten Datums- und Uhrzeitklassen also nie wieder verwenden.
Basil Bourque

-1

Ich weiß, dass dies ein sehr alter Beitrag ist. Ich dachte mein Wissen hier zu teilen!

Für das Datum Mitternacht heute mit genauer Zeitzone können Sie Folgendes verwenden

public static Date getCurrentDateWithMidnightTS(){

    return new Date(System.currentTimeMillis() - (System.currentTimeMillis()%(1000*60*60*24)) - (1000*60 * 330));
}

Wo (1000*60 * 330)subtrahiert wird, dh tatsächlich in Bezug auf die Zeitzone, zum Beispiel die indische Zeitzone, dh Kolkata, unterscheidet sich +5: 30 Stunden von der tatsächlichen. Subtrahieren Sie das also mit der Konvertierung in Millisekunden.

Ändern Sie also die zuletzt abgezogene Zahl entsprechend Ihren Angaben. Ich erstelle ein Produkt, das nur in Indien ansässig ist. Ich habe also nur einen bestimmten Zeitstempel verwendet.


1
Warum würden Sie dies anstelle der akzeptierten Antwort vorschlagen? Das Rollen Ihrer Datums- / Uhrzeitwerte ist im Allgemeinen riskant. Insbesondere ist dieser Code für immer fest auf den aktuellen Offset einer einzelnen Zeitzone codiert. Sommerzeit oder andere Anomalien werden nicht berücksichtigt. Ich sehe nur Nachteile ohne Mehrwert.
Basil Bourque

@Basil natürlich akzeptiere ich die Antwort und ja, ich habe dort für fest codierten Wert erwähnt. Dies ist nur hilfreich, wenn Sie an einer bestimmten Zeitzone arbeiten.
Rajeev

-1
Date todayMidnightUTC = java.sql.Date.valueOf(LocalDate.now());
Date tomorrowMidnightUTC = java.sql.Date.valueOf(LocalDate.now().plusDays(1));
Date anyMidnightLocal = java.sql.Date.valueOf(LocalDate.from(dateTime.toInstant().atZone(ZoneId.systemDefault())));

Aber Vorsicht, das java.sql.Date.toInstant()wirft immer UnsupportedOperationException.

Über LocalDate nach java.util.Date und umgekehrt einfachste Konvertierung?


Keine gute Antwort. Sie mischen die Verwendung der modernen Java-Zeit mit den alten Legacy-Klassen, die sie ersetzen. Insbesondere verwenden Sie die Datums- und Uhrzeitklassen java.sql, die nur zum Datenaustausch mit einer Datenbank verwendet werden sollten, deren Treiber noch nicht aktualisiert wurde, um direkt mit den Klassen java.time umzugehen, und die niemals für die Geschäftslogik verwendet werden dürfen. Ein weiteres Problem ist, dass Sie das entscheidende Problem der Zeitzone ignorieren.
Basil Bourque

@BasilBourque, danke für die Kritik. Die Verwendung einer Legacy-Klasse, die nicht als veraltet markiert ist, um eine andere Legacy-Klasseninstanz zu erhalten, ist ziemlich sicher. Das Problem der Zeitzone ist wichtiger. Ich beschloss schließlich, mich an Riccardos Antwort zu halten .
Vadzim

-1

Unmodern..

private static Date getDateWithMidnight(){
    long dateInMillis = new Date().getTime();
    return new Date(dateInMillis - dateInMillis%(1000*60*60*24) - TimeZone.getDefault().getOffset(dateInMillis));
}

Diese problematische Klasse wurde vor Jahren durch die Klasse java.time.Instant ersetzt . Keine Notwendigkeit, jemals zu verwenden Date.
Basil Bourque

Diese DateKlasse ist immer in UTC. Sie ignorieren also das Problem der gewünschten / erwarteten Zeitzone. Zum Beispiel bricht in Kolkata Indien ein neuer Tag viele Stunden früher als in UTC und Stunden später als UTC in Montréal Québec an.
Basil Bourque
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.