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

Java SE 8

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)));
Java SE 8

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:

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éfaut new 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

  1. LocalTime time = LocalTime.now();
  2. time = LocalTime.MIDNIGHT;
  3. time = LocalTime.NOON;
  4. 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.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow