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.Date
object. 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 Instant
is een basisklasse in java.time, die een moment op de tijdlijn in UTC vertegenwoordigt. Voer een Instant
naar 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
, & ; 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?
- Java SE 8, Java SE 9, Java SE 10, Java SE 11en later – Onderdeel van de standaard Java API met een gebundelde implementatie.
- Java 9 voegt enkele kleine functies en reparaties toe.
- Java SE 6en Java SE 7
- De meeste java.time-functionaliteit is teruggekoppeld naar Java 6 & 7 in ThreeTen-Backport.
- Android
- Latere versies van Android-bundelimplementaties van de klassen java.time.
- Voor eerdere Android (<26), de ThreeTenABP-project past ThreeTen-Backportaan (hierboven vermeld). Zie ThreeTenABP gebruiken….
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
, YearQuarter
en 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