webentwicklung-frage-antwort-db.com.de

Datum in einer einzigen Zeile einstellen

Gemäß der Java-API wird der Konstruktor Date(year, month, day) abgeschrieben. Ich weiß, dass ich es durch den folgenden Code ersetzen kann:

Calendar myCal = Calendar.getInstance();
myCal.set(Calendar.YEAR, theYear);
myCal.set(Calendar.MONTH, theMonth);
myCal.set(Calendar.DAY_OF_MONTH, theDay);
Date theDate = myCal.getTime();

Ich möchte jedoch etwas kürzeres ersetzen (idealerweise ein bis zwei Zeilen).

40
hibernate

Sie könnten new GregorianCalendar(theYear, theMonth, theDay).getTime() verwenden:

public GregorianCalendar(int year, int month, int dayOfMonth)

Erstellt einen GregorianCalendar mit dem angegebenen Datum, das in der Standardzeitzone mit dem Standardgebietsschema festgelegt ist.

73
aioobe

Du könntest benutzen

new SimpleDateFormat( "yyyyMMdd" ).parse( "20100520" )
21
tangens

Dies ist ein weiterer Grund, Joda Time zu verwenden.

new DateMidnight(2010, 3, 5)

DateMidnight ist jetzt veraltet, der gleiche Effekt kann jedoch mit Joda Time DateTime erzielt werden.

DateTime dt = new DateTime(2010, 3, 5, 0, 0);
14
Sean Owen

Der Kalender verfügt über eine set () - Methode, mit der Jahr, Monat und Tag in einem Anruf festgelegt werden können:

myCal.set( theYear, theMonth, theDay );
9
martin clayton

Warum schreibst du nicht einfach eine einfache Dienstmethode:

public final class DateUtils {
    private DateUtils() {
    }

    public static Calendar calendarFor(int year, int month, int day) {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, year);
        cal.set(Calendar.MONTH, month);
        cal.set(Calendar.DAY_OF_MONTH, day);
        return cal;
    }

    // ... maybe other utility methods
}

Und dann rufen Sie das im Rest Ihres Codes überall auf:

Calendar cal = DateUtils.calendarFor(2010, Calendar.MAY, 21);
5
Jesper

tl; dr

LocalDate.of( 2015 , Month.JUNE , 7 )  // Using handy `Month` enum. 

…oder…

LocalDate.of( 2015 , 6 , 7 )  // Sensible numbering, 1-12 for January to December. 

Java.time

Das in Java 8 und höher integrierte Java.time-Framework ersetzt die lästigen alten Klassen Java.util.Date/.Calendar.

Die Java.time-Klassen verwenden nveränderliche Objekte . Sie sind also von Natur aus threadsicher. Sie werden keines der Thread-Sicherheit ​​Probleme haben, die in den anderen Antworten erwähnt werden.

LocalDate

Dieses Framework enthielt eine Klasse für reine Datumsobjekte ohne Uhrzeit oder Zeitzone: LocalDate . Beachten Sie, dass eine Zeitzone (ZoneId) erforderlich ist, um ein Datum zu bestimmen.

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

Sie können für ein bestimmtes Datum instanziieren. Beachten Sie, dass die Monatszahl im Gegensatz zu den alten Klassen ein sinnvoller Bereich von 1 bis 12 ist.

LocalDate localDate = LocalDate.of( 2015 , 6 , 7 );

Oder verwenden Sie die Aufzählung Month .

LocalDate localDate = LocalDate.of( 2015 , Month.JUNE , 7 );

Konvertieren

Vermeiden Sie am besten die alten Datums- und Zeitklassen. Aber wenn Sie müssen, können Sie konvertieren. Rufen Sie neue Methoden auf, die den alten Klassen hinzugefügt wurden, um die Konvertierung zu erleichtern.

In diesem Fall müssen wir eine Uhrzeit angeben, die zu unserem Nur-Datum-Wert passt und für ein Java.util.Date - Objekt kombiniert werden soll. Der erste Moment des Tages macht wahrscheinlich Sinn. Lassen Sie Java.time die Zeit dieses ersten Moments bestimmen, da dies nicht immer 00:00:00.0 Ist.

Wir müssen auch eine Zeitzone angeben, da das Datum je nach Zeitzone variiert.

ZoneId zoneId = zoneId.of( "America/Montreal" );
ZonedDateTime zdt = localDate.atStartOfDay( zoneId );

Ein Instant ist eine grundlegende Klasse in Java.time, die einen Moment auf der Zeitachse in UTC darstellt. Füttere eine Instant zu konvertierende statische Methode am Datum.

Instant instant = zdt.toInstant();
Java.util.Date utilDate = Java.util.Date.from( instant );

Über Java.time

Das Java.time Framework ist in Java 8 und höher eingebaut. Diese Klassen verdrängen das lästige alte legacy Datum-Zeit-Klassen wie Java.util.Date , Calendar , & SimpleDateFormat .

Das Projekt Joda-Time , das sich jetzt im Wartungsmodus befindet, rät zur Migration auf Java.time = Klassen.

Weitere Informationen finden Sie im Oracle Tutorial . Durchsuchen Sie Stack Overflow nach vielen Beispielen und Erklärungen. Spezifikation ist JSR 31 .

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

Woher bekommen Sie die Java.time-Klassen?

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

4
Basil Bourque
Date date = new DateTime(2014, 6, 20, 0, 0).toDate();

DateTime stammt von Joda.org https://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html

2
Cheng

Verwenden Sie den Konstruktor Date(year,month,date) in Java 8, der veraltet ist:

Date date = new Date(1990, 10, 26, 0, 0);

Am besten verwenden Sie SimpleDateFormat

DateFormat format = new SimpleDateFormat("dd/MM/yyyy");
Date date = format.parse("26/10/1985");

sie müssen import Java.text.SimpleDateFormat; importieren

0
GAbriel lopez