Date & Time : Introduction aux variables dans Flutter


Avatar de Pierre Courtois

Gérer des dates et des heures est fondamentale pour une application qui permet de créer des évènements. Dans ce guide Flutter, je vous apprends à calculer des différences temporelles, formater des dates, et manipuler les dates en ajoutant ou soustrayant du temps.


mur d'horloges

Introduction à la classe DateTime

Comme son nom l’indique, la classe DateTime de Flutter vous permet de créer des variables de dates ou d’heures. Elle vous permet de représenter un point précis dans le temps, incluant à la fois la date (année, mois, jour) et l’heure (heure, minute, seconde, milliseconde). 

Cette classe vous permet également d’utiliser une variété de méthodes et d’opérateurs pour comparer des dates, changer leur format, ou les modifier. 

Par exemple, la classe DateTime peut être pratique si vous avez besoin : 

  • D’afficher l’heure dans votre application ;
  • Créer et modifier des évènements dans un calendrier ; 
  • Configurer des notifications de rappel ; 
  • Enregistrer le moment où l’utilisateur a réalisé une action (par exemple un achat) ; 
  • Calculer la durée entre deux évènements, etc.

Obtenir la date et l’heure actuelle

Pour obtenir la date et l’heure actuelles dans une application Flutter, la classe DateTime offre plusieurs méthodes. 

La méthode la plus simple et la plus courante pour obtenir la date et l’heure actuelles est d’utiliser DateTime.now(). Cette méthode retourne un objet DateTime qui représente la date et l’heure actuelles en temps local, au moment où la méthode est appelée.

void main() {
  DateTime now = DateTime.now();
  print("Date et heure actuelles : $now");
}

En revanche, si vous avez besoin du temps UTC (Temps Universel Coordonné), utilisez plutôt la méthode DateTime.now().toUtc().

void main() {
  DateTime nowUtc = DateTime.now().toUtc();
  print("Date et heure actuelles en UTC : $nowUtc");
}

Quelle différence entre le temps local et le temps UTC ?

Contrairement au temps local, qui prend en compte le fuseau horaire de l’appareil ou l’application s’exécute, le temps UTC n’est pas affecté ni par les fuseaux, ni par l’heure d’été. Utiliser DateTime.now() sera donc approprié si vous avez besoin de l’heure locale de l’utilisateur, par exemple pour l’afficher dans l’application. En revanche, il sera préférable d’utiliser DateTime.now().toUtc() pour enregistrer les timestamps dans une base de données ou pour synchroniser les événements entre différentes zones géographiques.

Sachez aussi qu’il existe un package Flutter Clock, vous permettant de manipuler des variables de temps et qui peut être assez pratique pour faire des tests unitaires. Celui-ci vous donne accès à l’heure actuelle, via sa méthode Clock.now().

Mettre en forme une date ou une heure

Flutter permet de travailler avec différents formats de date et d’heure grâce à la classe DateFormat du package intl.

Format ISO 8601

Le format ISO 8601 est un standard international pour représenter les dates et les heures. Il est souvent utilisé pour l’échange de données entre systèmes.

import 'package:intl/intl.dart';

void main() {
  DateTime specificTime = DateTime(2024, 6, 17, 15, 30, 0);
  DateFormat isoFormat = DateFormat("yyyy-MM-ddTHH:mm:ssZ");
  String isoFormatted = isoFormat.format(specificTime);
  print("Format ISO 8601 : $isoFormatted"); // Format ISO 8601 : 2024-06-17T15:30:00Z
}

Format local

Pour afficher les dates dans un format local, vous pouvez spécifier l’endroit de votre choix. Voici un exemple pour la France :

import 'package:intl/intl.dart';

void main() {
  DateTime specificTime = DateTime(2024, 6, 17, 15, 30, 0);
  DateFormat localFormat = DateFormat.yMMMMEEEEd('fr_FR').add_Hms();
  String localFormatted = localFormat.format(specificTime);
  print("Format local : $localFormatted"); //Format local : lundi 17 juin 2024 15:30:00
}

Format court (date seulement)

Le format court est utile pour afficher des dates de manière concise, comme dans les listes ou les en-têtes.

import 'package:intl/intl.dart';

void main() {
  DateTime specificTime = DateTime(2024, 6, 17, 15, 30, 0);
  DateFormat shortDateFormat = DateFormat.yMd();
  String shortDate = shortDateFormat.format(specificTime);
  print("Format court : $shortDate"); //Format court : 6/17/2024
}

Format complet (date et heure)

Le format complet inclut à la fois la date et l’heure, utile pour des affichages détaillés.

import 'package:intl/intl.dart';

void main() {
  DateTime specificTime = DateTime(2024, 6, 17, 15, 30, 0);
  DateFormat fullDateFormat = DateFormat.yMMMMd().add_jm();
  String fullDate = fullDateFormat.format(specificTime);
  print("Format complet : $fullDate"); //Format complet : June 17, 2024 3:30 PM
}

Format personnalisé

Enfin, vous pouvez créer des formats personnalisés, propres à vos besoins, en combinant différents symboles de formats. 

import 'package:intl/intl.dart';

void main() {
  DateTime specificTime = DateTime(2024, 6, 17, 15, 30, 0);

  // Format personnalisé : "Jour de la semaine, Jour Mois Année, Heure:Minute:Seconde"
  DateFormat customFormat = DateFormat("EEEE, d MMMM yyyy, HH:mm:ss");
  String customFormatted = customFormat.format(specificTime);
  print("Format personnalisé : $customFormatted"); //Format personnalisé : Monday, 17 June 2024, 15:30:00

  // Autre exemple : "Jour/Mois/Année Heure:Minute AM/PM"
  DateFormat anotherCustomFormat = DateFormat("dd/MM/yyyy hh:mm a");
  String anotherCustomFormatted = anotherCustomFormat.format(specificTime);
  print("Autre format personnalisé : $anotherCustomFormatted"); // Autre format personnalisé : 17/06/2024 03:30 PM
}

Comparer deux dates ou heures entre elles

Flutter fournit plusieurs moyens de comparer des dates ou des heures. Ceci peut se faire via les opérateurs de comparaison standards, mais aussi grâce à des méthodes spécifiques comme isBefore() et isAfter().

Importance des fuseaux horaires lors de la comparaison de dates

Lorsque vous comparez des dates et des heures, il est crucial de tenir compte des fuseaux horaires. Deux objets DateTime peuvent représenter la même heure dans différents fuseaux horaires, mais apparaître différents lorsqu’ils sont comparés directement. Assurez-vous donc d’avoir converti vos dates dans le même format avant de les comparer.

Utilisation des opérateurs de comparaison (==, !=, <, >, <=, >=)

Les opérateurs de comparaison vous permettent de comparer directement deux objets DateTime. Voici quelques exemples pour illustrer leur utilisation : 

void main() {
  DateTime date1 = DateTime(2024, 6, 17, 15, 30, 0);
  DateTime date2 = DateTime(2024, 6, 17, 18, 45, 0);
  DateTime date3 = DateTime(2023, 12, 25, 10, 0, 0);

  // Exemple simple: comparaison d'égalité
  bool isEqual = date1 == date2;
  print("date1 == date2 : $isEqual"); // false

  // Exemple moyen: comparaison d'inégalité
  bool isNotEqual = date1 != date3;
  print("date1 != date3 : $isNotEqual"); // true

  // Exemple complexe: utilisation de plusieurs opérateurs
  bool isBeforeOrEqual = date1 <= date2;
  bool isAfterOrEqual = date2 >= date3;
  print("date1 <= date2 : $isBeforeOrEqual"); // true
  print("date2 >= date3 : $isAfterOrEqual"); // true
}

Méthodes isBefore() et isAfter()

Les méthodes isBefore() et isAfter() de la classe DateTime vous permettent elles aussi de vérifier si une date se situe avant ou après une autre. Voici des exemples pour illustrer leur utilisation : 

void main() {
  DateTime date1 = DateTime(2024, 6, 17, 15, 30, 0);
  DateTime date2 = DateTime(2024, 6, 17, 18, 45, 0);
  DateTime date3 = DateTime(2023, 12, 25, 10, 0, 0);

  // Exemple simple: utilisation de isBefore()
  bool isDate1BeforeDate2 = date1.isBefore(date2);
  print("date1 est avant date2 : $isDate1BeforeDate2"); // true

  // Exemple moyen: utilisation de isAfter()
  bool isDate2AfterDate3 = date2.isAfter(date3);
  print("date2 est après date3 : $isDate2AfterDate3"); // true

  // Exemple complexe: combiner isBefore() et isAfter() pour vérifier si une date est entre deux autres
  bool isDate1Between = date1.isAfter(date3) && date1.isBefore(date2);
  print("date1 est entre date3 et date2 : $isDate1Between"); // true
}

Obtenir la durée entre deux dates ou heures

Pour calculer la durée entre deux dates ou heures dans Flutter, vous utiliserez la classe Duration. Cette classe permet de représenter une durée fixe, mesurée en termes de jours, heures, minutes, secondes et microsecondes. 

Grâce à sa méthode difference() la classe Duration vous permet de calculer la différence entre deux objets de type DateTime. Une fois cette durée obtenue, vous pourrez même accéder aux jours, heures, minutes, secondes et microsecondes individuellement.

Voici un exemple qui illustre comment utiliser Duration pour calculer la durée entre deux dates ou heures.

void main() {
  DateTime start = DateTime(2024, 6, 17, 10, 0, 0);
  DateTime end = DateTime(2024, 6, 17, 15, 30, 0);

  Duration difference = end.difference(start);
  print("Durée entre $start et $end : $difference");
//Durée entre 2024-06-17 10:00:00.000 et 2024-06-17 15:30:00.000 : 5:30:00.000000
}

Méthodes pour extraire des parties spécifiques de la durée

La classe Duration propose plusieurs méthodes pour accéder aux composants individuels d’une durée :

  • inDays : Retourne le nombre de jours dans la durée.
  • inHours : Retourne le nombre d’heures restantes après la conversion en jours.
  • inMinutes : Retourne le nombre de minutes restantes après la conversion en heures.
  • inSeconds : Retourne le nombre de secondes restantes après la conversion en minutes.
  • inMilliseconds : Retourne le nombre de millisecondes restantes après la conversion en secondes.
  • inMicroseconds : Retourne le nombre de microsecondes restantes après la conversion en millisecondes.

Voici comment utiliser ces méthodes pour extraire des parties spécifiques d’une durée :

void main() {
  DateTime start = DateTime(2024, 6, 17, 10, 0, 0);
  DateTime end = DateTime(2024, 6, 20, 15, 45, 0);

  Duration difference = end.difference(start);
  int days = difference.inDays;
  int hours = difference.inHours % 24;
  int minutes = difference.inMinutes % 60;
  int seconds = difference.inSeconds % 60;

  print("Durée totale : $days jours, $hours heures, $minutes minutes, $seconds secondes");
//Durée totale : 3 jours, 5 heures, 45 minutes, 0 secondes
}

Manipuler des dates (ajouter ou soustraire du temps)

Pour ajouter ou soustraire du temps à une variable de type DateTime, Flutter met à disposition les méthodes add() et subtract(). 

Méthode add()

La méthode add() permet d’ajouter une Duration à un objet DateTime, ce qui est utile pour calculer une date future en fonction d’une date donnée.

void main() {
  DateTime now = DateTime.now();
  Duration durationToAdd = Duration(days: 5, hours: 3, minutes: 20);

  DateTime futureDate = now.add(durationToAdd);
  print("Date dans 5 jours et 3 heures et 20 minutes : $futureDate");
//Date dans 5 jours et 3 heures et 20 minutes : 2024-06-22 19:11:53.862
}

Méthode subtract()

La méthode subtract() fonctionne de manière similaire mais soustrait une Duration d’un objet DateTime, permettant de calculer une date passée à partir d’une date donnée.

void main() {
  DateTime now = DateTime.now();
  Duration durationToSubtract = Duration(days: 10);

  DateTime pastDate = now.subtract(durationToSubtract);
  print("Date il y a 10 jours : $pastDate");
//Date il y a 10 jours : 2024-06-07 19:11:53.862
}

Conclusion

Vous êtes désormais capable de manipuler des variables de type Date ou Heure. Le dernier type de variable que je vais maintenant vous présenter sont les URIs :

Avatar de Pierre Courtois