Java Language
Date classe
Recherche…
Syntaxe
-
Date object = new Date();
-
Date object = new Date(long date);
Paramètres
Paramètre | Explication |
---|---|
Aucun paramètre | Crée un nouvel objet Date en utilisant l'heure d'allocation (à la milliseconde près) |
longue date | Crée un nouvel objet Date avec l'heure définie en nombre de millisecondes depuis "l'époque" (1er janvier 1970, 00:00:00 GMT) |
Remarques
Représentation
En interne, un objet Java Date est représenté comme un objet long; c'est le nombre de millisecondes depuis une heure spécifique (appelée époque ). La classe Java Date originale avait des méthodes pour gérer les fuseaux horaires, mais celles-ci étaient déconseillées en faveur de la nouvelle classe Calendar.
Donc, si tout ce que vous voulez faire dans votre code est de représenter une heure spécifique, vous pouvez créer une classe Date et la stocker, etc. Toutefois, si vous souhaitez imprimer une version lisible par l'homme, vous créez une classe Calendar. et utiliser son formatage pour produire des heures, des minutes, des secondes, des jours, des fuseaux horaires, etc. N'oubliez pas qu'une milliseconde spécifique est affichée sous forme d'heures différentes dans des fuseaux horaires différents; normalement, vous voulez en afficher un dans le fuseau horaire "local", mais les méthodes de formatage doivent tenir compte du fait que vous souhaiterez peut-être l'afficher pour un autre.
Sachez également que les horloges utilisées par les machines virtuelles Java n’ont généralement pas d’exactitude à la milliseconde; l'horloge peut seulement "cocher" toutes les 10 millisecondes et, par conséquent, si vous chronométrez les choses, vous ne pouvez pas compter sur des mesures précises à ce niveau.
Déclaration d'importation
import java.util.Date;
La classe Date
peut être importée à partir du package java.util
.
Mise en garde
Date
instances de Date
étant mutables, leur utilisation peut rendre difficile l'écriture de code adapté aux threads ou donner accidentellement un accès en écriture à l'état interne. Par exemple, dans la classe ci-dessous, la méthode getDate()
permet à l'appelant de modifier la date de la transaction:
public final class Transaction {
private final Date date;
public Date getTransactionDate() {
return date;
}
}
La solution consiste à renvoyer une copie du champ de date
ou à utiliser les nouvelles API de java.time
introduites dans Java 8.
La plupart des méthodes de constructeur de la classe Date
sont obsolètes et ne doivent pas être utilisées. Dans presque tous les cas, il est conseillé d'utiliser la classe Calendar
pour les opérations de date.
Java 8
Java 8 introduit une nouvelle API de date et heure dans le package java.time
, y compris LocalDate et LocalTime . Les classes du package java.time
fournissent une API révisée plus facile à utiliser. Si vous écrivez sur Java 8, nous vous encourageons vivement à utiliser cette nouvelle API. Voir Dates et heure (java.time. *) .
Créer des objets Date
Date date = new Date();
System.out.println(date); // Thu Feb 25 05:03:59 IST 2016
Ici, cet objet Date
contient la date et l'heure actuelles de création de cet objet.
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
objets de Date
sont mieux créés via une instance de Calendar
, car l'utilisation des constructeurs de données est déconseillée et déconseillée. Pour ce faire, nous devons obtenir une instance de la classe Calendar
partir de la méthode factory. Nous pouvons ensuite définir l'année, le mois et le jour du mois en utilisant des nombres ou, en cas de mois, des constantes fournies par la classe Calendar pour améliorer la lisibilité et réduire les erreurs.
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
Avec la date, nous pouvons également passer le temps dans l'ordre des heures, des minutes et des secondes.
Comparaison d'objets Date
Calendrier, Date et LocalDate
avant, après, compareTo et égale les méthodes
//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 et est égal à des méthodes
//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)));
Comparaison de dates avant Java 8
Avant Java 8, les dates pouvaient être comparées à l'aide des classes java.util.Calendar et java.util.Date . La classe de date offre 4 méthodes pour comparer les dates:
after
, before
, les méthodes compareTo
et equals
comparent les valeurs renvoyées par la méthode getTime () pour chaque date.
compareTo
méthode compareTo
renvoie un entier positif.
- Valeur supérieure à 0: lorsque la date est postérieure à l'argument Date
- Valeur supérieure à 0: lorsque la date est antérieure à l'argument Date
- La valeur est égale à 0: lorsque la date est égale à l'argument Date
equals
résultat peut être surprenant, comme indiqué dans l'exemple, car les valeurs, comme les millisecondes, ne sont pas initialisées avec la même valeur si elles ne sont pas explicitement données.
Depuis Java 8
Avec Java 8, un nouvel objet à utiliser avec Date est disponible java.time.LocalDate . LocalDate
implémente ChronoLocalDate , la représentation abstraite d'une date où la chronologie, ou le système de calendrier, est enfichable.
Pour avoir la précision de la date et de l'heure, l'objet java.time.LocalDateTime doit être utilisé. LocalDate
et LocalDateTime
utilisent le même nom de méthode pour la comparaison.
La comparaison de dates à l'aide d'un LocalDate
est différente de l'utilisation de ChronoLocalDate
car la chronologie ou le système de calendrier ne sont pas pris en compte pour le premier.
Comme la plupart des applications doivent utiliser LocalDate
, ChronoLocalDate
n'est pas inclus dans les exemples. Plus de lecture ici .
La plupart des applications doivent déclarer les signatures de méthode, les champs et les variables en tant que LocalDate, et non cette interface [ChronoLocalDate].
LocalDate
a 5 méthodes pour comparer les dates:
- isAfter (ChronoLocalDate autre)
- isBefore (ChronoLocalDate autre)
- isEqual (ChronoLocalDate autre)
- compareTo (ChronoLocalDate autre)
- est égal à (objet obj)
Dans le cas du paramètre LocalDate
, isAfter
, isBefore
, isEqual
, equals
et compareTo
utilise maintenant cette méthode:
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
méthode equals
vérifie si le paramètre reference est égal à la date en premier, alors que isEqual
appelle directement compareTo0
.
Dans le cas d'une autre instance de classe de ChronoLocalDate
les dates sont comparées à l'aide du Epoch Day
. Le nombre de jours Epoch est un nombre simple de jours où le jour 0 est 1970-01-01 (ISO).
Conversion de date en un certain format de chaîne
format()
de la classe SimpleDateFormat
permet de convertir un objet Date
un objet String
format String
à l'aide de la chaîne de motif fournie.
Date today = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yy"); //pattern is specified here
System.out.println(dateFormat.format(today)); //25-Feb-16
Les patterns peuvent être appliqués à nouveau en utilisant 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
Note: Ici mm
(petite lettre m) indique les minutes et MM
(majuscule M) indique le mois. Portez une attention particulière lors du formatage des années: le "Y" ( Y
) en majuscule indique la "semaine de l'année" tandis que "y" en minuscule ( y
) indique l'année.
Conversion de chaîne en date
parse()
de la classe SimpleDateFormat
permet de convertir un modèle String
en objet 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
Il existe 4 styles différents pour le format de texte, SHORT
, MEDIUM
(il s'agit de la valeur par défaut), LONG
et FULL
, qui dépendent tous des paramètres régionaux. Si aucun paramètre régional n'est spécifié, les paramètres régionaux par défaut du système sont utilisés.
Style | Locale.US | Locale.France |
---|---|---|
COURT | 30/06/09 | 30/06/09 |
MOYEN | 30 juin 2009 | 30 juin 2009 |
LONGUE | 30 juin 2009 | 30 juin 2009 |
PLEIN | Mardi 30 juin 2009 | mardi 30 juin 2009 |
Une sortie de date de base
En utilisant le code suivant avec la chaîne de format yyyy/MM/dd hh:mm.ss
, nous recevrons la sortie suivante
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()));
Convertir la représentation de chaîne formatée de la date en objet Date
Cette méthode peut être utilisée pour convertir une représentation de chaîne formatée d'une date en objet 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;
}
Créer une date spécifique
Bien que la classe Java Date ait plusieurs constructeurs, vous remarquerez que la plupart sont obsolètes. La seule façon acceptable de créer directement une instance Date est d'utiliser le constructeur vide ou de le faire en un temps long (nombre de millisecondes depuis le temps de base standard). Ni l'un ni l'autre n'est pratique à moins que vous recherchiez la date actuelle ou que vous ayez déjà une autre instance de date en main.
Pour créer une nouvelle date, vous aurez besoin d'une instance de calendrier. De là, vous pouvez définir l'instance du calendrier sur la date dont vous avez besoin.
Calendar c = Calendar.getInstance();
Cela retourne une nouvelle instance de calendrier définie à l'heure actuelle. Le calendrier a de nombreuses méthodes pour modifier sa date et son heure ou pour le configurer directement. Dans ce cas, nous allons définir une date spécifique.
c.set(1974, 6, 2, 8, 0, 0);
Date d = c.getTime();
La méthode getTime
renvoie l'instance Date dont nous avons besoin. Gardez à l'esprit que les méthodes du jeu de calendriers ne définissent qu'un ou plusieurs champs, mais ne les définissent pas tous. En d'autres termes, si vous définissez l'année, les autres champs restent inchangés.
PIÈGE
Dans de nombreux cas, cet extrait de code remplit son objectif, mais gardez à l'esprit que deux parties importantes de la date / heure ne sont pas définies.
- les paramètres
(1974, 6, 2, 8, 0, 0)
sont interprétés dans le fuseau horaire par défaut, défini ailleurs, - les millisecondes ne sont pas définies sur zéro, mais remplies à partir de l'horloge système au moment de la création de l'instance de calendrier.
Objets Java 8 LocalDate et LocalDateTime
Les objets Date et LocalDate ne peuvent pas être convertis exactement entre eux car un objet Date représente à la fois un jour et une heure spécifiques, tandis qu'un objet LocalDate ne contient pas d'informations sur l'heure ou le fuseau horaire. Cependant, il peut être utile de convertir entre les deux si vous ne vous souciez que des informations de date réelles et non des informations de temps.
Crée une 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());
Crée un 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 à date et 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 to Date et 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());
Fuseaux horaires et java.util.Date
Un objet java.util.Date
n'a pas de concept de fuseau horaire.
- Il est impossible de définir un fuseau horaire pour une date
- Il est impossible de modifier le fuseau horaire d'un objet Date
- Un objet Date créé avec le
new Date()
constructeur par défautnew Date()
sera initialisé avec l'heure actuelle dans le fuseau horaire par défaut du système
Cependant, il est possible d'afficher la date représentée par le moment décrit par l'objet Date dans un fuseau horaire différent en utilisant, par exemple, 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));
Sortie:
Central European Time
2016-07-21 22:50:56
2016-07-21 21:50:56
Convertissez java.util.Date en java.sql.Date
java.sql.Date
conversion java.util.Date
vers java.sql.Date
est généralement nécessaire lorsqu'un objet Date doit être écrit dans une base de données.
java.sql.Date
est un wrapper de valeur en millisecondes et est utilisé par JDBC
pour identifier un type de SQL DATE
Dans l'exemple ci-dessous, nous utilisons le constructeur java.util.Date()
, qui crée un objet Date et l'initialise pour représenter l'heure à la milliseconde près. Cette date est utilisée dans la méthode convert(java.util.Date utilDate)
pour renvoyer un objet java.sql.Date
Exemple
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;
}
}
Sortie
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
a à la fois des informations de date et d'heure, alors que java.sql.Date
n'a que des informations de date
Heure locale
Pour utiliser uniquement la partie heure d'une Date, utilisez LocalTime. Vous pouvez instancier un objet LocalTime de deux manières
-
LocalTime time = LocalTime.now();
-
time = LocalTime.MIDNIGHT;
-
time = LocalTime.NOON;
-
time = LocalTime.of(12, 12, 45);
LocalTime
également une méthode intégrée à toString qui affiche très bien le format.
System.out.println(time);
vous pouvez également obtenir, ajouter et soustraire des heures, des minutes, des secondes et des nanosecondes de l'objet LocalTime, c'est-à-dire
time.plusMinutes(1);
time.getMinutes();
time.minusMinutes(1);
Vous pouvez le transformer en un objet Date avec le code suivant:
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);
cette classe fonctionne très bien dans une classe de minuterie pour simuler un réveil.