Java Language
Datum Klasse
Zoeken…
Syntaxis
-
Date object = new Date();
-
Date object = new Date(long date);
parameters
Parameter | Uitleg |
---|---|
Geen parameter | Maakt een nieuw object Date met de toewijzingstijd (naar de dichtstbijzijnde milliseconde) |
lange date | Maakt een nieuw object Date met de tijd ingesteld op het aantal milliseconden sinds "het tijdperk" (1 januari 1970, 00:00:00 GMT) |
Opmerkingen
Vertegenwoordiging
Intern wordt een Java Date-object weergegeven als een lange; het is het aantal milliseconden sinds een specifieke tijd (het tijdvak genoemd ). De oorspronkelijke Java Date-klasse had methoden voor het omgaan met tijdzones, enz., Maar deze werden afgeschaft ten gunste van de toen nieuwe klasse Agenda.
Dus als het enige dat u in uw code wilt doen, een specifieke tijd vertegenwoordigt, kunt u een datumklasse maken en deze opslaan, enz. Als u een voor mensen leesbare versie van die datum wilt afdrukken, maakt u echter een kalenderklasse en gebruik de opmaak om uren, minuten, seconden, dagen, tijdzones, enz. te produceren. Houd er rekening mee dat een specifieke milliseconde als verschillende uren in verschillende tijdzones wordt weergegeven; Normaal gesproken wilt u er een in de "lokale" tijdzone weergeven, maar bij de formatteermethoden moet u er rekening mee houden dat u deze misschien voor een andere wilt weergeven.
Houd er ook rekening mee dat de klokken die door JVM's worden gebruikt meestal geen milliseconde-nauwkeurigheid hebben; de klok "tikt" maar om de 10 milliseconden, en daarom kunt u, als u dingen timing, niet vertrouwen op het nauwkeurig meten van dingen op dat niveau.
Importverklaring
import java.util.Date;
De klasse Date
kan worden geïmporteerd uit het pakket java.util
.
Voorzichtigheid
Date
gevallen zijn veranderlijk, dus het gebruik van hen kan het moeilijk maken om thread-safe code te schrijven of per ongeluk kan bieden schrijftoegang tot interne toestand. In de onderstaande klasse kan de beller bijvoorbeeld met de methode getDate()
de transactiedatum wijzigen:
public final class Transaction {
private final Date date;
public Date getTransactionDate() {
return date;
}
}
De oplossing is om een kopie van het date
te retourneren of de nieuwe API's te gebruiken in java.time
geïntroduceerd in Java 8.
De meeste constructormethoden in de klasse Date
zijn verouderd en mogen niet worden gebruikt. In bijna alle gevallen is het raadzaam om de klasse Calendar
te gebruiken voor datumbewerkingen.
Java 8
Java 8 introduceert een nieuwe tijd- en datum-API in het pakket java.time
, inclusief LocalDate en LocalTime . De klassen in het java.time
pakket bieden een vernieuwde API die eenvoudiger te gebruiken is. Als u naar Java 8 schrijft, wordt u ten zeerste aangeraden deze nieuwe API te gebruiken. Zie Datums en tijd (java.time. *) .
Datumobjecten maken
Date date = new Date();
System.out.println(date); // Thu Feb 25 05:03:59 IST 2016
Hier bevat dit object Date
de huidige datum en tijd waarop dit object is gemaakt.
Calendar calendar = Calendar.getInstance();
calendar.set(90, Calendar.DECEMBER, 11);
Date myBirthDate = calendar.getTime();
System.out.println(myBirthDate); // Mon Dec 31 00:00:00 IST 1990
Date
-objecten kunnen het best gemaakt door middel van een Calendar
bijvoorbeeld omdat het gebruik van de gegevens constructeurs is verouderd en ontmoedigd. Om dit te doen, moeten we een exemplaar van de klasse Calendar
van de fabrieksmethode krijgen. Vervolgens kunnen we jaar, maand en dag van de maand instellen met behulp van getallen of in het geval van maanden constanten verstrekt py de kalenderklasse om de leesbaarheid te verbeteren en fouten te verminderen.
calendar.set(90, Calendar.DECEMBER, 11, 8, 32, 35);
Date myBirthDatenTime = calendar.getTime();
System.out.println(myBirthDatenTime); // Mon Dec 31 08:32:35 IST 1990
Samen met de datum kunnen we ook tijd doorgeven in de volgorde van uren, minuten en seconden.
Datumobjecten vergelijken
Kalender, datum en lokale datum
before, after, CompareTo en is gelijk aan methoden
//Use of Calendar and Date objects
final Date today = new Date();
final Calendar calendar = Calendar.getInstance();
calendar.set(1990, Calendar.NOVEMBER, 1, 0, 0, 0);
Date birthdate = calendar.getTime();
final Calendar calendar2 = Calendar.getInstance();
calendar2.set(1990, Calendar.NOVEMBER, 1, 0, 0, 0);
Date samebirthdate = calendar2.getTime();
//Before example
System.out.printf("Is %1$tF before %2$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.before(birthdate)));
System.out.printf("Is %1$tF before %1$tF? %3$b%n", today, today, Boolean.valueOf(today.before(today)));
System.out.printf("Is %2$tF before %1$tF? %3$b%n", today, birthdate, Boolean.valueOf(birthdate.before(today)));
//After example
System.out.printf("Is %1$tF after %2$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.after(birthdate)));
System.out.printf("Is %1$tF after %1$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.after(today)));
System.out.printf("Is %2$tF after %1$tF? %3$b%n", today, birthdate, Boolean.valueOf(birthdate.after(today)));
//Compare example
System.out.printf("Compare %1$tF to %2$tF: %3$d%n", today, birthdate, Integer.valueOf(today.compareTo(birthdate)));
System.out.printf("Compare %1$tF to %1$tF: %3$d%n", today, birthdate, Integer.valueOf(today.compareTo(today)));
System.out.printf("Compare %2$tF to %1$tF: %3$d%n", today, birthdate, Integer.valueOf(birthdate.compareTo(today)));
//Equal example
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.equals(birthdate)));
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", birthdate, samebirthdate,
Boolean.valueOf(birthdate.equals(samebirthdate)));
System.out.printf(
"Because birthdate.getTime() -> %1$d is different from samebirthdate.getTime() -> %2$d, there are millisecondes!%n",
Long.valueOf(birthdate.getTime()), Long.valueOf(samebirthdate.getTime()));
//Clear ms from calendars
calendar.clear(Calendar.MILLISECOND);
calendar2.clear(Calendar.MILLISECOND);
birthdate = calendar.getTime();
samebirthdate = calendar2.getTime();
System.out.printf("Is %1$tF equal to %2$tF after clearing ms? %3$b%n", birthdate, samebirthdate,
Boolean.valueOf(birthdate.equals(samebirthdate)));
isBefore, isAfter, CompareTo en is gelijk aan methoden
//Use of LocalDate
final LocalDate now = LocalDate.now();
final LocalDate birthdate2 = LocalDate.of(2012, 6, 30);
final LocalDate birthdate3 = LocalDate.of(2012, 6, 30);
//Hours, minutes, second and nanoOfsecond can also be configured with an other class LocalDateTime
//LocalDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoOfSecond);
//isBefore example
System.out.printf("Is %1$tF before %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isBefore(birthdate2)));
System.out.printf("Is %1$tF before %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isBefore(now)));
System.out.printf("Is %2$tF before %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(birthdate2.isBefore(now)));
//isAfter example
System.out.printf("Is %1$tF after %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isAfter(birthdate2)));
System.out.printf("Is %1$tF after %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isAfter(now)));
System.out.printf("Is %2$tF after %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(birthdate2.isAfter(now)));
//compareTo example
System.out.printf("Compare %1$tF to %2$tF %3$d%n", now, birthdate2, Integer.valueOf(now.compareTo(birthdate2)));
System.out.printf("Compare %1$tF to %1$tF %3$d%n", now, birthdate2, Integer.valueOf(now.compareTo(now)));
System.out.printf("Compare %2$tF to %1$tF %3$d%n", now, birthdate2, Integer.valueOf(birthdate2.compareTo(now)));
//equals example
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.equals(birthdate2)));
System.out.printf("Is %1$tF to %2$tF? %3$b%n", birthdate2, birthdate3, Boolean.valueOf(birthdate2.equals(birthdate3)));
//isEqual example
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isEqual(birthdate2)));
System.out.printf("Is %1$tF to %2$tF? %3$b%n", birthdate2, birthdate3, Boolean.valueOf(birthdate2.isEqual(birthdate3)));
Datumvergelijking voor Java 8
Vóór Java 8 konden datums worden vergeleken met behulp van de klassen java.util.Calendar en java.util.Date . Datumklasse biedt 4 methoden om datums te vergelijken:
after
, before
, compareTo
en equals
methoden vergelijken de waarden geretourneerd door getTime () methode voor elke datum.
compareTo
methode retourneert een positief geheel getal.
- Waarde groter dan 0: wanneer de datum achter het argument Datum staat
- Waarde groter dan 0: wanneer de datum vóór het argument Datum ligt
- Waarde is gelijk aan 0: wanneer de datum gelijk is aan het argument Datum
equals
resultaten kan verrassend zijn zoals getoond in het voorbeeld omdat waarden, zoals milliseconden, niet worden geïnitialiseerd met dezelfde waarde als ze niet expliciet worden gegeven.
Sinds Java 8
Met Java 8 is een nieuw object om met Date te werken beschikbaar java.time.LocalDate . LocalDate
implementeert ChronoLocalDate , de abstracte weergave van een datum waarop de Chronology, of het kalendersysteem, kan worden ingeplugd.
Om de datum en tijd nauwkeurig te hebben, moet het object java.time.LocalDateTime worden gebruikt. LocalDate
en LocalDateTime
gebruiken dezelfde methodennaam voor het vergelijken.
Het vergelijken van datums met behulp van een LocalDate
verschilt van het gebruik van ChronoLocalDate
omdat de chronologie of het kalendersysteem niet in aanmerking worden genomen bij het eerste.
Omdat de meeste toepassingen LocalDate
zouden moeten gebruiken, is ChronoLocalDate
niet in voorbeelden opgenomen. Verder lezen hier .
De meeste toepassingen moeten methodehandtekeningen, velden en variabelen als LocalDate declareren, niet deze [ChronoLocalDate] -interface.
LocalDate
heeft 5 methoden om datums te vergelijken:
- isAfter (ChronoLocalDate anders)
- isBefore (ChronoLocalDate anders)
- isEqual (ChronoLocalDate anders)
- vergelijkTo (ChronoLocalDate anders)
- is gelijk aan (Object obj)
In het geval van de parameter LocalDate
is isAfter
, isBefore
, isEqual
, is equals
en vergelijk. compareTo
nu deze methode:
int compareTo0(LocalDate otherDate) {
int cmp = (year - otherDate.year);
if (cmp == 0) {
cmp = (month - otherDate.month);
if (cmp == 0) {
cmp = (day - otherDate.day);
}
}
return cmp;
}
equals
methode check of de parameterverwijzing eerst gelijk is aan de datum, terwijl isEqual
direct vergelijkTo0 compareTo0
.
In het geval van een ander klasse-exemplaar van ChronoLocalDate
de datums vergeleken met behulp van Epoch Day
. De Epoch Day-telling is een eenvoudige oplopende telling van dagen waarbij dag 0 1970-01-01 (ISO) is.
Datum converteren naar een bepaalde tekenreeksindeling
format()
van de klasse SimpleDateFormat
helpt bij het converteren van een Date
object naar een bepaald format String
object met behulp van de meegeleverde patroonreeks .
Date today = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yy"); //pattern is specified here
System.out.println(dateFormat.format(today)); //25-Feb-16
Patronen kunnen opnieuw worden toegepast met applyPattern()
dateFormat.applyPattern("dd-MM-yyyy");
System.out.println(dateFormat.format(today)); //25-02-2016
dateFormat.applyPattern("dd-MM-yyyy HH:mm:ss E");
System.out.println(dateFormat.format(today)); //25-02-2016 06:14:33 Thu
Opmerking: hier geeft mm
(kleine letter m) minuten aan en MM
(hoofdletter M) geeft maand aan. Let goed op bij het formatteren van jaren: hoofdletter "Y" ( Y
) geeft de "week in het jaar" aan, terwijl kleine letters "y" ( y
) het jaar aangeven.
String omzetten in datum
parse()
uit de klasse SimpleDateFormat
helpt bij het converteren van een String
naar een object Date
.
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US);
String dateStr = "02/25/2016"; // input String
Date date = dateFormat.parse(dateStr);
System.out.println(date.getYear()); // 116
Er zijn 4 verschillende stijlen voor de tekstindeling, SHORT
, MEDIUM
(dit is de standaardinstelling), LONG
en FULL
, die allemaal afhankelijk zijn van de landinstelling. Als er geen landinstelling is opgegeven, wordt de standaardlandinstelling van het systeem gebruikt.
Stijl | Locale.US | Locale.France |
---|---|---|
SHORT | 6/30/09 | 30/06/09 |
MEDIUM | 30 juni 2009 | 30 juni 2009 |
LANG | 30 juni 2009 | 30 juni 2009 |
FULL | Dinsdag 30 juni 2009 | mardi 30 juni 2009 |
Een standaard datumuitvoer
Met de volgende code met de notatie string yyyy/MM/dd hh:mm.ss
, ontvangen we de volgende uitvoer
2016/04/19 11: 45.36
// define the format to use
String formatString = "yyyy/MM/dd hh:mm.ss";
// get a current date object
Date date = Calendar.getInstance().getTime();
// create the formatter
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(formatString);
// format the date
String formattedDate = simpleDateFormat.format(date);
// print it
System.out.println(formattedDate);
// single-line version of all above code
System.out.println(new SimpleDateFormat("yyyy/MM/dd hh:mm.ss").format(Calendar.getInstance().getTime()));
Converteer opgemaakte tekenreeksrepresentatie van datum naar object Date
Deze methode kan worden gebruikt om een opgemaakte tekenreeksrepresentatie van een datum om te zetten in een object Date
.
/**
* Parses the date using the given format.
*
* @param formattedDate the formatted date string
* @param dateFormat the date format which was used to create the string.
* @return the date
*/
public static Date parseDate(String formattedDate, String dateFormat) {
Date date = null;
SimpleDateFormat objDf = new SimpleDateFormat(dateFormat);
try {
date = objDf.parse(formattedDate);
} catch (ParseException e) {
// Do what ever needs to be done with exception.
}
return date;
}
Een specifieke datum maken
Hoewel de Java Date-klasse verschillende constructors heeft, zult u merken dat de meeste zijn verouderd. De enige acceptabele manier om een Date-instantie direct te maken, is door de lege constructor te gebruiken of lang door te geven (aantal milliseconden sinds standaard basistijd). Geen van beide is handig, tenzij u op zoek bent naar de huidige datum of een andere Date-instantie al in de hand hebt.
Als u een nieuwe datum wilt maken, hebt u een exemplaar van Agenda nodig. Van daaruit kunt u de instantie Agenda instellen op de datum die u nodig hebt.
Calendar c = Calendar.getInstance();
Dit retourneert een nieuwe agenda-instantie die is ingesteld op de huidige tijd. Agenda heeft vele methoden om de datum en tijd te wijzigen of om het volledig in te stellen. In dit geval stellen we het in op een specifieke datum.
c.set(1974, 6, 2, 8, 0, 0);
Date d = c.getTime();
De methode getTime
retourneert de Date-instantie die we nodig hebben. Houd er rekening mee dat de methoden voor het instellen van de kalender alleen een of meer velden instellen, ze niet allemaal. Dat wil zeggen, als u het jaar instelt, blijven de andere velden ongewijzigd.
VALKUIL
In veel gevallen voldoet dit codefragment aan zijn doel, maar houd er rekening mee dat twee belangrijke delen van de datum / tijd niet zijn gedefinieerd.
- de parameters
(1974, 6, 2, 8, 0, 0)
worden geïnterpreteerd binnen de standaardtijdzone, ergens anders gedefinieerd, - de milliseconden zijn niet ingesteld op nul, maar gevuld vanuit de systeemklok op het moment dat de kalenderinstantie wordt gemaakt.
Java 8 LocalDate- en LocalDateTime-objecten
Date- en LocalDate-objecten kunnen niet exact onderling worden geconverteerd, aangezien een Date-object zowel een specifieke dag als een specifieke tijd vertegenwoordigt, terwijl een LocalDate-object geen informatie over tijd of tijdzone bevat. Het kan echter handig zijn om tussen de twee te converteren als u alleen om de actuele datuminformatie geeft en niet om de tijdinformatie.
Creëert een LocalDate
// Create a default date
LocalDate lDate = LocalDate.now();
// Creates a date from values
lDate = LocalDate.of(2017, 12, 15);
// create a date from string
lDate = LocalDate.parse("2017-12-15");
// creates a date from zone
LocalDate.now(ZoneId.systemDefault());
Creëert een LocalDateTime
// Create a default date time
LocalDateTime lDateTime = LocalDateTime.now();
// Creates a date time from values
lDateTime = LocalDateTime.of(2017, 12, 15, 11, 30);
// create a date time from string
lDateTime = LocalDateTime.parse("2017-12-05T11:30:30");
// create a date time from zone
LocalDateTime.now(ZoneId.systemDefault());
LocalDate tot op heden en vice versa
Date date = Date.from(Instant.now());
ZoneId defaultZoneId = ZoneId.systemDefault();
// Date to LocalDate
LocalDate localDate = date.toInstant().atZone(defaultZoneId).toLocalDate();
// LocalDate to Date
Date.from(localDate.atStartOfDay(defaultZoneId).toInstant());
LocalDateTime tot datum en vice versa
Date date = Date.from(Instant.now());
ZoneId defaultZoneId = ZoneId.systemDefault();
// Date to LocalDateTime
LocalDateTime localDateTime = date.toInstant().atZone(defaultZoneId).toLocalDateTime();
// LocalDateTime to Date
Date out = Date.from(localDateTime.atZone(defaultZoneId).toInstant());
Tijdzones en java.util.Datum
Een java.util.Date
object heeft geen concept van tijdzone.
- Er is geen manier om een andere tijdzone instellen voor een Date
- Er is geen manier om de tijdzone van een object Date te wijzigen
- Een object Date dat is gemaakt met de
new Date()
standaardconstructornew Date()
, wordt geïnitialiseerd met de huidige tijd in de standaardtijdzone van het systeem
Het is echter mogelijk om de datum weergegeven door het tijdstip dat wordt beschreven door het object Date in een andere tijdzone weer te geven met bijvoorbeeld java.text.SimpleDateFormat
:
Date date = new Date();
//print default time zone
System.out.println(TimeZone.getDefault().getDisplayName());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //note: time zone not in format!
//print date in the original time zone
System.out.println(sdf.format(date));
//current time in London
sdf.setTimeZone(TimeZone.getTimeZone("Europe/London"));
System.out.println(sdf.format(date));
Output:
Central European Time
2016-07-21 22:50:56
2016-07-21 21:50:56
Converteer java.util.Date naar java.sql.Date
java.util.Date
naar java.sql.Date
conversie is meestal nodig wanneer een object Date in een database moet worden geschreven.
java.sql.Date
is een wrapper rond de milliseconde-waarde en wordt door JDBC
gebruikt om een SQL DATE
type te identificeren
In het onderstaande voorbeeld gebruiken we de constructor java.util.Date()
, die een object Date maakt en dit initialiseert om de tijd tot de dichtstbijzijnde milliseconde weer te geven. Deze datum wordt gebruikt in de methode convert(java.util.Date utilDate)
om een object java.sql.Date
te retourneren
Voorbeeld
public class UtilToSqlConversion {
public static void main(String args[])
{
java.util.Date utilDate = new java.util.Date();
System.out.println("java.util.Date is : " + utilDate);
java.sql.Date sqlDate = convert(utilDate);
System.out.println("java.sql.Date is : " + sqlDate);
DateFormat df = new SimpleDateFormat("dd/MM/YYYY - hh:mm:ss");
System.out.println("dateFormated date is : " + df.format(utilDate));
}
private static java.sql.Date convert(java.util.Date uDate) {
java.sql.Date sDate = new java.sql.Date(uDate.getTime());
return sDate;
}
}
uitgang
java.util.Date is : Fri Jul 22 14:40:35 IST 2016
java.sql.Date is : 2016-07-22
dateFormated date is : 22/07/2016 - 02:40:35
java.util.Date
bevat zowel datum- als java.sql.Date
, terwijl java.sql.Date
alleen datuminformatie bevat
Lokale tijd
Gebruik LocalTime om alleen het tijdgedeelte van een datum te gebruiken. U kunt een LocalTime-object op verschillende manieren instantiëren
-
LocalTime time = LocalTime.now();
-
time = LocalTime.MIDNIGHT;
-
time = LocalTime.NOON;
-
time = LocalTime.of(12, 12, 45);
LocalTime
ook een ingebouwde toString-methode die het formaat zeer mooi weergeeft.
System.out.println(time);
u kunt ook uren, minuten, seconden en nanoseconden ophalen, toevoegen en aftrekken van het LocalTime-object ie
time.plusMinutes(1);
time.getMinutes();
time.minusMinutes(1);
U kunt er een Date-object van maken met de volgende code:
LocalTime lTime = LocalTime.now();
Instant instant = lTime.atDate(LocalDate.of(A_YEAR, A_MONTH, A_DAY)).
atZone(ZoneId.systemDefault()).toInstant();
Date time = Date.from(instant);
deze klasse werkt heel mooi binnen een timerklasse om een wekker te simuleren.