4 Stimmen

Was ist der richtige Weg, um den Zeitteil aus java.util.Date zu entfernen?

Ich möchte eine Thread-sichere Funktion implementieren, um den Zeitteil aus java.util.Date zu entfernen.

Ich habe es auf diese Weise versucht

private static final DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
public static Date removeTimeFromDate(Date date) {
        Date returnDate = date;

        if (date == null) {
            return returnDate;
        }

        //just have the date remove the time
        String targetDateStr = df.format(date);
        try {
            returnDate = df.parse(targetDateStr);
        } catch (ParseException e) {
        }

        return returnDate;
}

und verwenden Sie synchronisierte oder threadLocal, um es Thread-sicher zu machen. Aber es gibt einen besseren Weg, um es in Java zu implementieren. Es scheint, dass dieser Weg ein bisschen umständlich ist. Ich bin nicht zufrieden mit ihm.

9voto

Martijn Courteaux Punkte 65602

A Date Objekt enthält eine Variable, die die Zeit als die Anzahl der Millisekunden seit Epoche . Sie können also den Zeitteil nicht "entfernen". Was Sie tun können, ist, die Zeit dieses Tages auf Null zu setzen, was bedeutet, dass es 00:00:00 000 dieses Tages sein wird. Dies geschieht durch die Verwendung eines Gregorianischen Kalenders:

GregorianCalendar gc = new GregorianCalendar();
gc.setTime(date);
gc.set(Calendar.HOUR_OF_DAY, 0);
gc.set(Calendar.MINUTE, 0);
gc.set(Calendar.SECOND, 0);
gc.set(Calendar.MILLISECOND, 0);
Date returnDate = gc.getTime();

4voto

Jon Skeet Punkte 1325502

A Date hält eine sofort in der Zeit - das heißt, es wird nicht eindeutig ein bestimmtes Datum angegeben. Sie müssen also eine Zeitzone angeben außerdem um herauszufinden, auf welches Datum etwas fällt. Dann müssen Sie sich überlegen, wie Sie das Ergebnis darstellen wollen - als Date mit einem Wert von "Mitternacht an diesem Datum in UTC" zum Beispiel?

Sie sollten auch beachten, dass Mitternacht selbst nicht an allen Tagen in allen Zeitzonen stattfindet, da die Sommerzeitumstellung um Mitternacht stattfinden kann. (Brasilien ist ein gängiges Beispiel dafür.)

Es sei denn, Sie sind まったくもって verheiratet mit Date y Calendar würde ich empfehlen, dass Sie mit der Joda Zeit stattdessen, da dies einen Wert vom Typ LocalDate die die meisten dieser Probleme beseitigt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X