Wie formatiere ich ein Datum mit Dart?


139

Ich habe eine Instanz von DateTimeund möchte diese in einen String formatieren. Wie mache ich das? Ich möchte das Datum in eine Zeichenfolge verwandeln, so etwas wie "2013-04-20".

Antworten:


294

Sie können das intlPaket ( Installationsprogramm ) verwenden, um Daten zu formatieren.

Für en_USFormate ist es ganz einfach:

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
}

Es gibt viele Optionen zum Formatieren. Aus den Dokumenten:

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

Bei Nicht- en_USDatumsangaben müssen Sie das Gebietsschema explizit laden. Weitere Informationen finden Sie in den DateFormatDokumenten . Das date_symbol_data_local.dartenthält alle Formate für jedes Land / jede Sprache, wenn Sie einen genaueren Blick wünschen.


Ist intl kaputt? Nicht erfasster Fehler: FileSystemException: Datei kann nicht geöffnet werden, Pfad = 'E: \ dart \ ws \ web \ packages \ intl \ intl.dart' (Betriebssystemfehler: Das System kann den angegebenen Pfad nicht finden.
javapadawan

1
Gibt es eine Möglichkeit, dem Format Millisekunden hinzuzufügen?
Kaspi

2
erfordert in pubspec.yaml Abhängigkeiten: intl: ^ 0.15.7
murt

Wie können wir nur einen Monat holen, z. 1 für Januar, 2 für Februar ...? Ich habe DateFormat ('MM'). format (DateTime.now ()) ausprobiert. funktioniert aber nicht im flattern. Bitte teilen Sie Ihren Vorschlag.
Kamlesh

@ Kaspi versuchen Sie 'S' für Sekundenbruchteil
badelectron77

31

Das wird auch funktionieren:

DateTime today = new DateTime.now();
String dateSlug ="${today.year.toString()}-${today.month.toString().padLeft(2,'0')}-${today.day.toString().padLeft(2,'0')}";
print(dateSlug);


11

Wenn jemand ein Datum im Zeichenfolgenformat in ein anderes Zeichenfolgenformat konvertieren möchte, verwenden Sie zuerst DateTime.parse ("2019-09-30") und übergeben Sie es dann an DateFormat ("Datumsmuster"). Format () wie

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

Referenz: Dart - So ändern Sie das Format einer einfachen Datumszeichenfolge in JJJJ-MM-TT in TT-MM-JJJJ


1
Ihr Code verwendet, DateFormataber Ihr Text sagtDateTime.format()
mFeinstein

Hoppla! ein Fehler. Geändert :)
Shashank

9

Dies gibt Ihnen das Datum wie in einem sozialen Netzwerk: ["heute", "gestern", "Tag der Woche" usw.]

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 "thurdsday";
          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}';
      }
      return "";
    }

1
Sehr nützlich - danke. Fügen Sie diese zusätzliche Zeile oben in der Methode hinzu, wenn Sie Datumsangaben mit einer Zeit übergeben. Andernfalls funktioniert 'gestern' möglicherweise nicht: tm = DateTime (tm.year, tm.month, tm.day);
Nick Wright

8

Es gibt ein Paket 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"

Achtung: Minuten sind nn

Link zum Paket


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
}

Ergebnis:

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

1

Wenn Sie mehrere Datumsformate zu einem kombinieren möchten, können wir dies auf folgende Weise tun intl.

DateFormat('yMMMd').addPattern(DateFormat.HOUR24_MINUTE).format(yourDateTime))

0
import 'package:intl/intl.dart';

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

Weitere Informationen finden Sie in der DateFormat-Dokumentation


0

Bei der Bearbeitung der jährlichen Quartale, von der Zeichenfolge bis zur DateTime, habe ich keine geeignete Lösung gefunden.

    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;
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.