Comment formater une date avec Dart?

144

J'ai une instance de DateTimeet je voudrais la formater en String. Comment je fais ça? Je veux transformer la date en une chaîne, quelque chose comme "2013-04-20".

Seth Ladd
la source

Réponses:

300

Vous pouvez utiliser le intlpackage (programme d' installation ) pour formater les dates.

Pour les en_USformats, c'est assez simple:

import 'package:intl/intl.dart';

main() {
  final DateTime now = DateTime.now();
  final DateFormat formatter = DateFormat('yyyy-MM-dd');
  final String formatted = formatter.format(now);
  print(formatted); // something like 2013-04-20
}

Il existe de nombreuses options de formatage. À partir de la documentation:

ICU Name                   Skeleton
--------                   --------
DAY                          d
ABBR_WEEKDAY                 E
WEEKDAY                      EEEE
ABBR_STANDALONE_MONTH        LLL
STANDALONE_MONTH             LLLL
NUM_MONTH                    M
NUM_MONTH_DAY                Md
NUM_MONTH_WEEKDAY_DAY        MEd
ABBR_MONTH                   MMM
ABBR_MONTH_DAY               MMMd
ABBR_MONTH_WEEKDAY_DAY       MMMEd
MONTH                        MMMM
MONTH_DAY                    MMMMd
MONTH_WEEKDAY_DAY            MMMMEEEEd
ABBR_QUARTER                 QQQ
QUARTER                      QQQQ
YEAR                         y
YEAR_NUM_MONTH               yM
YEAR_NUM_MONTH_DAY           yMd
YEAR_NUM_MONTH_WEEKDAY_DAY   yMEd
YEAR_ABBR_MONTH              yMMM
YEAR_ABBR_MONTH_DAY          yMMMd
YEAR_ABBR_MONTH_WEEKDAY_DAY  yMMMEd
YEAR_MONTH                   yMMMM
YEAR_MONTH_DAY               yMMMMd
YEAR_MONTH_WEEKDAY_DAY       yMMMMEEEEd
YEAR_ABBR_QUARTER            yQQQ
YEAR_QUARTER                 yQQQQ
HOUR24                       H
HOUR24_MINUTE                Hm
HOUR24_MINUTE_SECOND         Hms
HOUR                         j
HOUR_MINUTE                  jm
HOUR_MINUTE_SECOND           jms
HOUR_MINUTE_GENERIC_TZ       jmv
HOUR_MINUTE_TZ               jmz
HOUR_GENERIC_TZ              jv
HOUR_TZ                      jz
MINUTE                       m
MINUTE_SECOND                ms
SECOND                       s

Pour les non- en_USdates, vous devez charger explicitement dans les paramètres régionaux. Consultez la DateFormatdocumentation pour plus d'informations. Le date_symbol_data_local.dartcontient tous les formats pour chaque pays / langue, si vous souhaitez un examen plus approfondi.

Seth Ladd
la source
Intl est-il cassé? Erreur non interceptée: FileSystemException: Impossible d'ouvrir le fichier, chemin = 'E: \ dart \ ws \ web \ packages \ intl \ intl.dart' (Erreur du système d'exploitation: le système ne trouve pas le chemin spécifié.
javapadawan
1
Existe-t-il un moyen d'ajouter des millisecondes au format?
Kaspi
2
nécessite dans les dépendances pubspec.yaml: intl: ^ 0.15.7
murt
comment pouvons-nous aller chercher seulement mois par exemple. 1 pour janvier, 2 pour février ...? j'ai essayé DateFormat ('MM'). format (DateTime.now ()); mais ne fonctionne pas en flottement. Veuillez partager votre suggestion.
Kamlesh le
@Kaspi essaie 'S' pendant une fraction de seconde
badelectron77
32

Cela fonctionnera aussi:

DateTime today = new DateTime.now();
String dateSlug ="${today.year.toString()}-${today.month.toString().padLeft(2,'0')}-${today.day.toString().padLeft(2,'0')}";
print(dateSlug);
Ravin du péril
la source
14

Si quelqu'un veut convertir une date au format chaîne en un autre format chaîne, utilisez d'abord DateTime.parse ("2019-09-30") puis transmettez-la à DateFormat ("modèle de date"). Format () comme

dateFormate = DateFormat("dd-MM-yyyy").format(DateTime.parse("2019-09-30"));

Référence: Dart - Comment changer le format de la chaîne de date simple qui est en aaaa-MM-jj en jj-MM-aaaa

Shashank
la source
1
votre code utilise DateFormatmais votre texte ditDateTime.format()
mFeinstein
Oups! une gaffe. Changé :)
Shashank
12

Cela vous donne la date comme dans un réseau social: ["aujourd'hui", "hier", "jour de la semaine", etc.]

void main() {
      DateTime now = new DateTime(2018,6,26);
      print(date(now));
    }
    
    String date(DateTime tm) {
      DateTime today = new DateTime.now();
      Duration oneDay = new Duration(days: 1);
      Duration twoDay = new Duration(days: 2);
      Duration oneWeek = new Duration(days: 7);
      String month;
      switch (tm.month) {
        case 1:
          month = "january";
          break;
        case 2:
          month = "february";
          break;
        case 3:
          month = "march";
          break;
        case 4:
          month = "april";
          break;
        case 5:
          month = "may";
          break;
        case 6:
          month = "june";
          break;
        case 7:
          month = "july";
          break;
        case 8:
          month = "august";
          break;
        case 9:
          month = "september";
          break;
        case 10:
          month = "october";
          break;
        case 11:
          month = "november";
          break;
        case 12:
          month = "december";
          break;
      }
    
      Duration difference = today.difference(tm);
    
      if (difference.compareTo(oneDay) < 1) {
        return "today";
      } else if (difference.compareTo(twoDay) < 1) {
        return "yesterday";
      } else if (difference.compareTo(oneWeek) < 1) {
        switch (tm.weekday) {
          case 1:
            return "monday";
          case 2:
            return "tuesday";
          case 3:
            return "wednesday";
          case 4:
            return "thursday";
          case 5:
            return "friday";
          case 6:
            return "saturday";
          case 7:
            return "sunday";
        }
      } else if (tm.year == today.year) {
        return '${tm.day} $month';
      } else {
        return '${tm.day} $month ${tm.year}';
      }
    }
Raoul Scalise
la source
2
Très utile - merci. Ajoutez cette ligne supplémentaire en haut de la méthode si vous passez des dates qui ont une heure, sinon «hier» peut ne pas fonctionner: tm = DateTime (tm.year, tm.month, tm.day);
Nick Wright le
8

Il existe un package date_format

dependencies:
    date_format:

code

import 'package:date_format/date_format.dart';

final formattedStr = formatDate(
    yourDateTime, [dd, '.', mm, '.', yy, ' ', HH, ':', nn]);

// output example "29.03.19 07:00"

Faites attention: les minutes sont nn

lien vers le package

Andreï
la source
2

pubspec.yaml:

dependencies:
  intl:

main.dart:

import 'package:intl/intl.dart'; // for date format
import 'package:intl/date_symbol_data_local.dart'; // for other locales

void main() {
  var now = DateTime.now();
  print(DateFormat().format(now)); // This will return date using the default locale
  print(DateFormat('yyyy-MM-dd hh:mm:ss').format(now));
  print(DateFormat.yMMMMd().format(now)); // print long date 
  print(DateFormat.yMd().format(now)); // print short date 
  print(DateFormat.jms().format(now)); // print time 

  initializeDateFormatting('es'); // This will initialize Spanish locale
  print(DateFormat.yMMMMd('es').format(now)); // print long date in Spanish format
  print(DateFormat.yMd('es').format(now)); // print short date in Spanish format
  print(DateFormat.jms('es').format(now)); // print time in Spanish format
}

Résultat:

May 31, 2020 5:41:42 PM
2020-05-31 05:41:42
May 31, 2020
5/31/2020
5:41:42 PM
31 de mayo de 2020
31/5/2020
17:41:42
l'amour en direct
la source
1

Dans le cas où vous souhaitez combiner plusieurs formats de date en un seul, voici comment nous pouvons le faire intl.

DateFormat('yMMMd').addPattern(DateFormat.HOUR24_MINUTE).format(yourDateTime))
brianCommeApple
la source
0
import 'package:intl/intl.dart';

main() {
  var formattedDate = new DateTime.Format('yyyy-MM-dd').DateTime.now();
  print(formattedDate); // something like 2020-04-16
}

Pour plus de détails, vous pouvez consulter la documentation DateFormat

Srinath Kalikivayi
la source
0

gérant les trimestres annuels, de la chaîne au DateTime, je n'ai pas trouvé de solution appropriée, alors j'ai fait ceci:

    List<String> dateAsList = 'Q1 2001'.split(' ');
    DateTime dateTime = DateTime.now();
    String quarter = dateAsList[0];
    int year = int.parse(dateAsList[1]);
    switch(quarter) {
      case "Q1": dateTime = DateTime(year, 1);
      break;
      case "Q2": dateTime = DateTime(year, 4);
      break;
      case "Q3": dateTime = DateTime(year, 7);
      break;
      case "Q4": dateTime = DateTime(year, 10);
      break;
    }
FlutterFan
la source