Stel datum in op één regel

Volgens de Java API is de constructor Date(year, month, day)verouderd. Ik weet dat ik het kan vervangen door de volgende code:

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();

Ik zou echter iets korters willen om het te vervangen (idealiter een tot twee regels).


Antwoord 1, autoriteit 100%

Je zou new GregorianCalendar(theYear, theMonth, theDay).getTime():

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

Construeert een Gregoriaanse kalender met de opgegeven datum ingesteld in de standaard tijdzone met de standaard locale.


Antwoord 2, autoriteit 30%

Je zou kunnen gebruiken

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

Antwoord 3, autoriteit 18%

Dit is nog een reden om Joda Time te gebruiken

new DateMidnight(2010, 3, 5)

DateMidnight is nu verouderd, maar hetzelfde effect kan worden bereikt met Joda Time DateTime

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

Antwoord 4, autoriteit 12%

Kalender heeft een set()methode die het jaar, de maand en de dag van de maand in één aanroep kan instellen:

myCal.set( theYear, theMonth, theDay );

Antwoord 5, autoriteit 9%

Waarom schrijf je niet gewoon een eenvoudige hulpprogramma-methode:

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
}

En noem dat dan overal in de rest van je code:

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

Antwoord 6, autoriteit 9%

tl;dr

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

…of…

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

java.time

Het java.time-framework dat in Java 8 is ingebouwd en later de lastige oude klassen, java.util.Date/.Calendar, vervangt.

De java.time-klassen gebruiken onveranderlijke objecten. Ze zijn dus inherent draadveilig. U zult geen van de thread-safetyproblemen hebben die in de andere antwoorden worden genoemd.

LocalDate

Dit raamwerk omvatte een klasse voor alleen-datum-objecten zonder tijd van de dag of tijdzone, LocalDate. Houd er rekening mee dat een tijdzone (ZoneId) nodig is om een ​​datum te bepalen.

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

Je kunt instantiëren voor een specifieke datum. Merk op dat het maandnummer een verstandig bereik van 1-12 is, in tegenstelling tot de oude klassen.

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

Of gebruik de opsomming, Month.

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

Converteren

Het is het beste om de oude datum-tijdklassen te vermijden. Maar als het moet, kun je converteren. Roep nieuwe methoden aan die aan de oude klassen zijn toegevoegd om conversies te vergemakkelijken.

In dit geval moeten we een tijd van de dag specificeren die past bij onze waarde voor alleen datum, om te combineren voor een java.util.Dateobject. Het eerste moment van de dag is waarschijnlijk logisch. Laat java.time de tijd van dat eerste moment bepalen, want het is niet altijd 00:00:00.0.

We moeten ook een tijdzone specificeren, aangezien de datum per tijdzone verschilt.

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

Een Instantis een basisklasse in java.time, die een moment op de tijdlijn in UTC vertegenwoordigt. Voer een Instantnaar statische methode op Datum om te converteren.

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

Over java.time

De java.time framework is ingebouwd in Java 8 en hoger. Deze klassen vervangen de lastige oude legacydatum-tijdklassen zoals java.util.Date, Calendar, &amp ; SimpleDateFormat.

Het Joda-Time-project, nu in onderhoudsmodus, adviseert migratie naar de java.timeklassen.

Zie voor meer informatie de Oracle-zelfstudie. En zoek Stack Overflow voor veel voorbeelden en uitleg. Specificatie is JSR 310.

U kunt java.timeobjecten rechtstreeks uitwisselen met uw database. Gebruik een JDBC-stuurprogrammadat voldoet aan JDBC 4.2of hoger. Geen strings nodig, geen java.sql.*klassen.

Waar zijn de java.time-klassen te verkrijgen?

Het ThreeTen-Extra-project verlengt java.time met extra lessen. Dit project is een proeftuin voor mogelijke toekomstige toevoegingen aan java.time. Mogelijk vindt u hier enkele nuttige klassen, zoals Interval, YearWeek, YearQuarteren meer.


Antwoord 7, autoriteit 2%

Gebruik de constructor Date(year,month,date)in Java 8 deze is verouderd:

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

De beste manier is om SimpleDateFormat

. te gebruiken

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

je moet import java.text.SimpleDateFormat;

importeren


Antwoord 8, autoriteit 2%

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

DateTime is van Joda.org https:/ /www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html

Other episodes