Wie erhalte ich die Start- und Endzeit eines Tages?


120

Wie erhalte ich die Start- und Endzeit eines Tages?

Code wie dieser ist nicht korrekt:

 private Date getStartOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
    int day = calendar.get(Calendar.DATE);
    calendar.set(year, month, day, 0, 0, 0);
    return calendar.getTime();
}

private Date getEndOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
    int day = calendar.get(Calendar.DATE);
    calendar.set(year, month, day, 23, 59, 59);
    return calendar.getTime();
}

Es ist nicht millisekundengenau.


8
Was meinst du damit, dass es "nicht genau" ist?
Kirk Woll

Was ist los mit dem Code? Was bekommen Sie, was Sie nicht erwarten? Nach welcher Zeitzone sollen Ihre Tage beginnen und enden?
Mark Reed

4
Der obige Code verwendet nicht einmal das Datum, das an die Methode übergeben wurde. Es sollte Folgendes tun: calendar.setTime (Datum), nachdem der Kalender erstellt wurde.
Jerry Destremps

2
Bei dieser Frage wird davon ausgegangen, dass Datums- und Uhrzeitwerte eine Auflösung von Millisekunden haben. True für java.util.Date und Joda-Time. Falsch für das Paket java.time in Java 8 (Nanosekunden), einige Datenbanken wie Postgres (Mikrosekunden), Unix-Bibliotheken (ganze Sekunden) und möglicherweise andere. Siehe meine Antwort für einen sichereren Ansatz mit Half-Open.
Basil Bourque

2
Eigentlich sollten Sie den Anfang des nächsten Tages erhalten und wenn Sie die Elemente an diesem Tag wiederholen (vorausgesetzt, Sie möchten dies tun), geben Sie die Obergrenze an, indem Sie <anstelle von <= verwenden. Das würde den nächsten Tag ausschließen, aber den gesamten vorherigen Tag bis auf die Nanosekunde einschließen.
Daniel F

Antworten:


114

tl; dr

LocalDate                       // Represents an entire day, without time-of-day and without time zone.
.now(                           // Capture the current date.
    ZoneId.of( "Asia/Tokyo" )   // Returns a `ZoneId` object.
)                               // Returns a `LocalDate` object.
.atStartOfDay(                  // Determines the first moment of the day as seen on that date in that time zone. Not all days start at 00:00!
    ZoneId.of( "Asia/Tokyo" ) 
)                               // Returns a `ZonedDateTime` object.

Tagesanfang

Holen Sie sich die volle Länge des heutigen Tages aus einer Zeitzone.

Verwendung des Half-Open-Ansatzes, bei dem der Anfang inklusive und das Ende exklusiv ist . Dieser Ansatz behebt den Fehler in Ihrem Code, der die letzte Sekunde des Tages nicht berücksichtigt.

ZoneId zoneId = ZoneId.of( "Africa/Tunis" ) ;
LocalDate today = LocalDate.now( zoneId  ) ;

ZonedDateTime zdtStart = today.atStartOfDay( zoneId ) ;
ZonedDateTime zdtStop = today.plusDays( 1 ).atStartOfDay( zoneId ) ;

zdtStart.toString () = 2020-01-30T00: 00 + 01: 00 [Afrika / Tunis]

zdtStop.toString () = 2020-01-31T00: 00 + 01: 00 [Afrika / Tunis]

Sehen Sie die gleichen Momente in UTC.

Instant start = zdtStart.toInstant() ;
Instant stop = zdtStop.toInstant() ;

start.toString () = 2020-01-29T23: 00: 00Z

stop.toString () = 2020-01-30T23: 00: 00Z

Wenn Sie den gesamten Tag eines Datums wie in UTC und nicht in einer Zeitzone anzeigen möchten, verwenden Sie OffsetDateTime.

LocalDate today = LocalDate.now( ZoneOffset.UTC  ) ;

OffsetDateTime odtStart = today.atTime( OffsetTime.MIN ) ;
OffsetDateTime odtStop = today.plusDays( 1 ).atTime( OffsetTime.MIN ) ;

odtStart.toString () = 2020-01-30T00: 00 + 18: 00

odtStop.toString () = 2020-01-31T00: 00 + 18: 00

Diese OffsetDateTime Objekte befinden sich bereits in UTC. Sie können sie jedoch aufrufen, toInstantwenn Sie solche Objekte benötigen, die sich per Definition immer in UTC befinden.

Instant start = odtStart.toInstant() ;
Instant stop = odtStop.toInstant() ;

start.toString () = 2020-01-29T06: 00: 00Z

stop.toString () = 2020-01-30T06: 00: 00Z

Tipp: Möglicherweise möchten Sie Ihrem Projekt die ThreeTen-Extra- Bibliothek hinzufügen , um deren IntervalKlasse zur Darstellung dieses Objektpaars zu verwenden Instant. Diese Klasse bietet nützliche Methoden zum Vergleich wie abuts, overlaps, containsund vieles mehr.

Interval interval = Interval.of( start , stop ) ;

interval.toString () = 2020-01-29T06: 00: 00Z / 2020-01-30T06: 00: 00Z

Halb offen

Die Antwort von mprivat ist richtig. Sein Ziel ist es, nicht zu versuchen, das Ende eines Tages zu erreichen, sondern mit "vor Beginn des nächsten Tages" zu vergleichen. Seine Idee ist als "Half-Open" -Ansatz bekannt, bei dem eine Zeitspanne einen Anfang hat, der inklusiv ist, während das Ende exklusiv ist .

  • Die aktuellen Datums- und Uhrzeit-Frameworks von Java (java.util.Date/Calendar und Joda-Time ) verwenden beide Millisekunden aus der Epoche . In Java 8 verwenden die neuen JSR 310-Klassen java.time. * Eine Auflösung von Nanosekunden. Jeder Code, den Sie basierend auf dem Erzwingen der Millisekundenzahl des letzten Momentes des Tages geschrieben haben, wäre falsch, wenn Sie zu den neuen Klassen wechseln würden.
  • Der Vergleich von Daten aus anderen Quellen wird fehlerhaft, wenn andere Auflösungen verwendet werden. Beispielsweise verwenden Unix-Bibliotheken normalerweise ganze Sekunden, und Datenbanken wie Postgres lösen Datum und Uhrzeit in Mikrosekunden auf.
  • Einige Änderungen der Sommerzeit finden über Mitternacht statt, was die Dinge weiter verwirren könnte.

Geben Sie hier die Bildbeschreibung ein

Joda-Time 2.3 bietet genau zu diesem Zweck eine Methode, um den ersten Moment des Tages zu erhalten : withTimeAtStartOfDay(). Ähnlich in java.time , LocalDate::atStartOfDay.

Durchsuchen Sie StackOverflow nach "joda half-open" , um weitere Diskussionen und Beispiele zu sehen.

Siehe diesen Beitrag, Zeitintervalle und andere Bereiche sollten von Bill Schneider halb offen sein .

Vermeiden Sie ältere Datums- und Zeitklassen

Die Klassen java.util.Date und .Calendar sind notorisch problematisch. Vermeide sie.

Verwenden Sie java.time- Klassen. Das java.time- Framework ist der offizielle Nachfolger der äußerst erfolgreichen Joda-Time- Bibliothek.

java.time

Das java.time-Framework ist in Java 8 und höher integriert. Back-portiert Java 6 und 7 in dem ThreeTen-Backport - Projekt weiter zu Android angepasst im ThreeTenABP Projekt.

An Instantist ein Moment auf der Zeitachse in UTC mit einer Auflösung von Nanosekunden .

Instant instant = Instant.now();

Wenden Sie eine Zeitzone an, um die Wanduhrzeit für einen bestimmten Ort zu ermitteln.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

Um den ersten Moment des Tages zu erleben, gehen Sie die LocalDateKlasse und ihre atStartOfDayMethode durch.

ZonedDateTime zdtStart = zdt.toLocalDate().atStartOfDay( zoneId );

Holen Sie sich mit dem Half-Open-Ansatz den ersten Moment des folgenden Tages.

ZonedDateTime zdtTomorrowStart = zdtStart.plusDays( 1 );

Tabelle aller Datums- und Uhrzeittypen in Java, sowohl moderne als auch ältere

Derzeit fehlt dem java.time-Framework eine IntervalKlasse, wie unten für Joda-Time beschrieben. Das ThreeTen-Extra- Projekt erweitert java.time jedoch um zusätzliche Klassen. Dieses Projekt ist das Testfeld für mögliche zukünftige Ergänzungen von java.time. Zu seinen Klassen gehört Interval. Konstruieren Sie eine, Intervalindem Sie ein Objektpaar übergeben Instant. Wir können eine Instantaus unseren ZonedDateTimeObjekten extrahieren .

Interval today = Interval.of( zdtStart.toInstant() , zdtTomorrowStart.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.

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

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

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. Hibernate 5 und JPA 2.2 unterstützen java.time .

Woher bekomme ich die java.time-Klassen?


Joda-Zeit

UPDATE: Das Joda-Time-Projekt befindet sich jetzt im Wartungsmodus und empfiehlt die Migration zu den Klassen java.time . Ich lasse diesen Abschnitt für die Geschichte intakt.

Joda-Time hat drei Klassen eine Zeitspanne auf verschiedene Weise darstellen: Interval, Period, und Duration. An Intervalhat einen bestimmten Anfang und ein bestimmtes Ende auf der Zeitachse des Universums. Dies passt zu unserem Bedürfnis, "einen Tag" darzustellen.

Wir rufen die Methode auf, withTimeAtStartOfDayanstatt die Tageszeit auf Null zu setzen. Aufgrund der Sommerzeit und anderer Anomalien ist der erste Moment des Tages möglicherweise nicht der richtige 00:00:00.

Beispielcode mit Joda-Time 2.3.

DateTimeZone timeZone = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( timeZone );
DateTime todayStart = now.withTimeAtStartOfDay();
DateTime tomorrowStart = now.plusDays( 1 ).withTimeAtStartOfDay();
Interval today = new Interval( todayStart, tomorrowStart );

Wenn Sie müssen, können Sie in ein java.util.Date konvertieren.

java.util.Date date = todayStart.toDate();

Ich muss verwendenLocalDateTime
user924

170

Java 8


public static Date atStartOfDay(Date date) {
    LocalDateTime localDateTime = dateToLocalDateTime(date);
    LocalDateTime startOfDay = localDateTime.with(LocalTime.MIN);
    return localDateTimeToDate(startOfDay);
}

public static Date atEndOfDay(Date date) {
    LocalDateTime localDateTime = dateToLocalDateTime(date);
    LocalDateTime endOfDay = localDateTime.with(LocalTime.MAX);
    return localDateTimeToDate(endOfDay);
}

private static LocalDateTime dateToLocalDateTime(Date date) {
    return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
}

private static Date localDateTimeToDate(LocalDateTime localDateTime) {
    return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}

Aktualisieren : Ich habe hinzugefügt , um diese zwei Methoden , um meine Java Utility - Klassen hier

Es befindet sich im Maven Central Repository unter:

<dependency>
  <groupId>com.github.rkumsher</groupId>
  <artifactId>utils</artifactId>
  <version>1.3</version>
</dependency>

Java 7 und früher


Mit Apache Commons

public static Date atEndOfDay(Date date) {
    return DateUtils.addMilliseconds(DateUtils.ceiling(date, Calendar.DATE), -1);
}

public static Date atStartOfDay(Date date) {
    return DateUtils.truncate(date, Calendar.DATE);
}

Ohne Apache Commons

public Date atEndOfDay(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();
}

public Date atStartOfDay(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();
}

5
Ich empfehle gegen diesen Ansatz, da bei Zeitzonen, Sommerzeit usw. Probleme mit Randfällen auftreten, die eine Zeitbibliothek wie Joda für Sie erledigt.
Edward Anderson

7
Ich denke in getStartOfDaysollte sein: LocalDateTime startOfDay = localDateTime.with(LocalTime.MIN);Dh LocalTime, nicht LocalDateTime.
Konstantin Kulagin

Denk nicht an die getEndOfDay(Date date). getStartOfDay(Date date)Die Methoden im Abschnitt Java 8 sind korrekt. Mit LocalDateTime.MAX und .MIN können Sie die frühestmöglichen Daten in der Vergangenheit und in der Zukunft festlegen, nicht den Anfang und das Ende eines Tages. Stattdessen würde ich .atStartOfDay () für start und .plusDays (1) .atStartOfDay (). MinusNanos (1) für end vorschlagen.
Glen Mazza

Methode localDateTimeToDate(LocalDateTime startOfDay)
löst

1
@GlenMazza Die Java 8-Lösung verwendet LocalTime .MAX , nicht LocalDateTime.MAX . Die Lösung ist richtig.
Frederico Pantuzza

28

In getEndOfDay können Sie Folgendes hinzufügen:

calendar.set(Calendar.MILLISECOND, 999);

Obwohl mathematisch gesehen, können Sie das Ende eines Tages nur angeben, indem Sie sagen, dass es "vor dem Beginn des nächsten Tages" ist.

Anstatt zu sagen, if(date >= getStartOfDay(today) && date <= getEndOfDay(today))sollten Sie sagen : if(date >= getStartOfDay(today) && date < getStartOfDay(tomorrow)). Das ist eine viel solidere Definition (und Sie müssen sich keine Gedanken über die Millisekundengenauigkeit machen).


1
Die zweite Hälfte dieser Antwort ist der beste Weg. Dieser Ansatz ist als "Half-Open" bekannt. Ich erkläre es weiter in meiner Antwort .
Basil Bourque

14

java.time

Verwenden eines java.timein Java 8 integrierten Frameworks.

import java.time.LocalTime;
import java.time.LocalDateTime;

LocalDateTime now = LocalDateTime.now(); // 2015-11-19T19:42:19.224
// start of a day
now.with(LocalTime.MIN); // 2015-11-19T00:00
now.with(LocalTime.MIDNIGHT); // 2015-11-19T00:00
// end of a day
now.with(LocalTime.MAX); // 2015-11-19T23:59:59.999999999

3
Diese Antwort ignoriert Anomalien wie die Sommerzeit (DST). Die Local…Klassen haben kein Konzept für Zeitzonen und passen sich an Anomalien an. In einigen Zeitzonen wird beispielsweise die Sommerzeit um Mitternacht umgeschaltet, sodass der erste Moment des Tages auf der Uhrzeit 01:00:00.0(1 Uhr morgens) liegt und nicht auf dem 00:00:00.0von diesem Code erzeugten Wert. Verwenden Sie ZonedDateTimestattdessen.
Basil Bourque

4

Eine zusätzliche Möglichkeit, den Tagesanfang mit java8 java.time.ZonedDateTime zu ermitteln, LocalDateTimebesteht darin, die Eingabe ZonedDateTime auf DAYS zu kürzen:

zonedDateTimeInstance.truncatedTo( ChronoUnit.DAYS );

2

Für Java 8 funktionieren die folgenden einzeiligen Anweisungen. In diesem Beispiel verwende ich die UTC-Zeitzone. Bitte überlegen Sie, die aktuell verwendete Zeitzone zu ändern.

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

final LocalDateTime endOfDay       = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
final Date          endOfDayAsDate = Date.from(endOfDay.toInstant(ZoneOffset.UTC));

System.out.println(endOfDayAsDate);

final LocalDateTime startOfDay       = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
final Date          startOfDayAsDate = Date.from(startOfDay.toInstant(ZoneOffset.UTC));

System.out.println(startOfDayAsDate);

Wenn kein Zeitunterschied zur Ausgabe besteht. Versuchen:ZoneOffset.ofHours(0)


1
Wie schafft dies einen Mehrwert, der über den der vorhandenen Antworten hinausgeht? Außerdem ignorieren Sie das entscheidende Problem der Zeitzone. Die Übergabe der UTC-Konstante an toInstantist unzulässig und konzeptionell redundant.
Basil Bourque

@BasilBourque "Wie schafft dies einen Mehrwert, der über den der vorhandenen Antworten hinausgeht?" So funktioniert der Stackoverflow. Übrigens ist dies nur eine Vorlage. Menschen können die Art und Weise ändern, wie sie wollen. Die Übergabe von UTC an Instant ist völlig legal. Sie können die Ausgaben überprüfen.
Fırat KÜÇÜK

2

Java 8 oder ThreeTenABP

ZonedDateTime

ZonedDateTime curDate = ZonedDateTime.now();

public ZonedDateTime startOfDay() {
    return curDate
    .toLocalDate()
    .atStartOfDay()
    .atZone(curDate.getZone())
    .withEarlierOffsetAtOverlap();
}

public ZonedDateTime endOfDay() {

    ZonedDateTime startOfTomorrow =
        curDate
        .toLocalDate()
        .plusDays(1)
        .atStartOfDay()
        .atZone(curDate.getZone())
        .withEarlierOffsetAtOverlap();

    return startOfTomorrow.minusSeconds(1);
}

// based on https://stackoverflow.com/a/29145886/1658268

LocalDateTime

LocalDateTime curDate = LocalDateTime.now();

public LocalDateTime startOfDay() {
    return curDate.atStartOfDay();
}

public LocalDateTime endOfDay() {
    return startOfTomorrow.atTime(LocalTime.MAX);  //23:59:59.999999999;
}

// based on https://stackoverflow.com/a/36408726/1658268

Ich hoffe das hilft jemandem.


Die "atTime" -Methode ist ein sehr guter Ansatz zusammen mit der Konstanten "LocalTime.MAX" für das Tagesende. Nett!
Mr. Anderson

2

Ich habe diesen Code ausprobiert und er funktioniert gut!

final ZonedDateTime now = ZonedDateTime.now(ZoneOffset.UTC);
final ZonedDateTime startofDay =
    now.toLocalDate().atStartOfDay(ZoneOffset.UTC);
final ZonedDateTime endOfDay =
    now.toLocalDate().atTime(LocalTime.MAX).atZone(ZoneOffset.UTC);

Wenn Sie ZonedDateTimeund Instantzu Ihrer Verfügung haben, besteht keine Notwendigkeit, jemals zu verwenden java.sql.Timestamp. Diese Klasse ist eine der schrecklichen alten Legacy-Klassen, die jetzt durch die java.time- Klassen ersetzt werden. Ab JDBC 4.2 können wir java.time- Objekte direkt mit der Datenbank austauschen . Ihre Vermischung von Vermächtnis und modernem Unterricht macht für mich keinen Sinn.
Basil Bourque

1

Eine andere Lösung, die von keinem Framework abhängt, ist:

static public Date getStartOfADay(Date day) {
    final long oneDayInMillis = 24 * 60 * 60 * 1000;
    return new Date(day.getTime() / oneDayInMillis * oneDayInMillis);
}

static public Date getEndOfADay(Date day) {
    final long oneDayInMillis = 24 * 60 * 60 * 1000;
    return new Date((day.getTime() / oneDayInMillis + 1) * oneDayInMillis - 1);
}

Beachten Sie, dass die UTC-basierte Zeit zurückgegeben wird


1
private Date getStartOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
    int day = calendar.get(Calendar.DATE);
    calendar.setTimeInMillis(0);
    calendar.set(year, month, day, 0, 0, 0);
    return calendar.getTime();
    }

private Date getEndOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
    int day = calendar.get(Calendar.DATE);
    calendar.setTimeInMillis(0);
    calendar.set(year, month, day, 23, 59, 59);
    return calendar.getTime();
    }

calendar.setTimeInMillis (0); gibt Ihnen Genauigkeit bis zu Millisekunden


1
Diese schrecklichen Datums- und Uhrzeitklassen wurden vor Jahren durch die modernen Java.time- Klassen ersetzt, die in JSR 310 definiert sind.
Basil Bourque

@BasilBourque das Paket java.time erschien nur in Java 8, das erst seit Android N (API 26) verfügbar ist
ivan8m8

@ ivan8m8 Die meisten Funktionen von java.time werden in der ThreeTen-Backport- Bibliothek auf Java 6 & 7 zurückportiert . Weiter angepasst für frühes Android (<26) in der ThreeTenABP- Bibliothek.
Basil Bourque

@BasilBourque, aber das ThreeTen verwendet einen extrem ineffizienten Mechanismus unter Android .
ivan8m8

@ ivan8m8 Du denkst vielleicht an den Vorgänger von java.time , Joda-Time . Siehe auch das ThreeTenABP- Projekt. Ich habe noch nie von einer solchen Ineffizienz unter Android gehört, die diese Bibliothek verwendet.
Basil Bourque

0

Ich weiß, dass es etwas spät ist, aber im Fall von Java 8 können Sie den folgenden Code verwenden, wenn Sie OffsetDateTime verwenden (das viele Vorteile wie TimeZone, Nanosekunden usw. bietet):

OffsetDateTime reallyEndOfDay = someDay.withHour(23).withMinute(59).withSecond(59).withNano(999999999);
// output: 2019-01-10T23:59:59.999999999Z

0

Ich hatte einige Unannehmlichkeiten mit allen Lösungen, weil ich den Typ der Sofortvariablen brauchte und die Zeitzone immer störte, alles zu ändern und dann Lösungen zu kombinieren. Ich sah, dass dies eine gute Option ist.

        LocalDate today = LocalDate.now();
        Instant startDate = Instant.parse(today.toString()+"T00:00:00Z");
        Instant endDate = Instant.parse(today.toString()+"T23:59:59Z");

und wir haben als Ergebnis

        startDate = 2020-01-30T00:00:00Z
        endDate = 2020-01-30T23:59:59Z

Ich hoffe es hilft dir


Der Tag endet tatsächlich mit der Ankunft des ersten Augenblicks des folgenden Tages. Ihr Code überspringt die letzte volle Sekunde eines Tages, eine Milliarde Nanosekunden, die nie gemeldet werden. In meiner Antwort erfahren Sie mehr über den Half-Open-Ansatz zur Definition einer Zeitspanne.
Basil Bourque

Das Manipulieren von Zeichenfolgen als Methode zum Behandeln von Datums- und Uhrzeitwerten ist im Allgemeinen ein schlechter Ansatz. Verwenden Sie für diese Arbeit eher intelligente Objekte als dumme Zeichenfolgen. Die java.time- Klassen bieten alle Funktionen, die Sie für dieses Problem benötigen, ohne auf die Manipulation von Zeichenfolgen zurückgreifen zu müssen.
Basil Bourque

Ich habe gerade einen tl; dr Abschnitt meine Antwort zeigt , wie die Reichweite eines Tages als ein Paar zu bekommen InstantObjekte. Tipp: Möglicherweise möchten Sie die ThreeTen-Extra- Bibliothek zu Ihrem Projekt hinzufügen , um dessen IntervalKlasse zu verwenden.
Basil Bourque

0

Ich denke, das Einfachste wäre so etwas wie:

// Joda Time

DateTime dateTime=new DateTime(); 

StartOfDayMillis = dateTime.withMillis(System.currentTimeMillis()).withTimeAtStartOfDay().getMillis();
EndOfDayMillis = dateTime.withMillis(StartOfDayMillis).plusDays(1).minusSeconds(1).getMillis();

Diese Millis können dann gemäß Ihren Anforderungen mit Joda Time in Kalender, Instant oder LocalDate konvertiert werden.


-2
public static Date beginOfDay(Date 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);

    return cal.getTime();
}

public static Date endOfDay(Date date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.HOUR_OF_DAY, 23);
    cal.set(Calendar.MINUTE, 59);
    cal.set(Calendar.SECOND, 59);
    cal.set(Calendar.MILLISECOND, 999);

    return cal.getTime();
}
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.