Jak sformatować datę w Dart?

163

Mam wystąpienie DateTimei chciałbym sformatować go na String. Jak mogę to zrobić? Chcę zmienić datę w ciąg znaków, coś w rodzaju „2013-04-20”.

Seth Ladd
źródło

Odpowiedzi:

345

Możesz użyć intlpakietu ( instalatora ) do formatowania dat.

W przypadku en_USformatów jest to dość proste:

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
}

Istnieje wiele opcji formatowania. Z dokumentów:

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

W przypadku innych niż en_USdaty musisz jawnie załadować ustawienia regionalne. Zobacz DateFormatdokumentację, aby uzyskać więcej informacji. date_symbol_data_local.dartZawiera wszystkich formatów dla każdego kraju / języka, jeśli chcesz spojrzeć bardziej dogłębne.

Seth Ladd
źródło
Czy intl jest uszkodzony? Uncaught Error: FileSystemException: Cannot open file, path = 'E: \ dart \ ws \ web \ packages \ intl \ intl.dart' (Błąd systemu operacyjnego: system nie może znaleźć określonej ścieżki.
javapadawan
1
Czy istnieje sposób na dodanie milisekund do formatu?
Kaspi
2
wymaga w zależności pubspec.yaml: Intl: ^ 0.15.7
Murt
jak możemy pobrać tylko miesiąc np. 1 za styczeń, 2 za luty ...? Próbowałem DateFormat ('MM'). format (DateTime.now ()); ale nie działa w trzepotaniu. Podziel się swoją sugestią.
Kamlesh
@Kaspi spróbuj „S” przez ułamek sekundy
badelectron77
38

To też zadziała:

DateTime today = new DateTime.now();
String dateSlug ="${today.year.toString()}-${today.month.toString().padLeft(2,'0')}-${today.day.toString().padLeft(2,'0')}";
print(dateSlug);
Wąwóz Peril
źródło
16

Jeśli ktoś chce przekonwertować datę w formacie ciągu na inny format ciągu, najpierw użyj DateTime.parse ("2019-09-30"), a następnie przekaż go do DateFormat ("wzorzec daty"). Format () jak

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

Odniesienie: Dart - Jak zmienić format prostego ciągu daty w formacie rrrr-MM-dd na dd-MM-rrrr

Shashank
źródło
1
twój kod używa, DateFormatale twój tekst mówiDateTime.format()
Michel Feinstein
Ups! pomyłka. Zmieniono :)
Shashank
15

To daje datę jak w sieci społecznościowej: [„dzisiaj”, „wczoraj”, „dzień tygodnia” itd.]

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
źródło
2
Bardzo przydatne - dziękuję. Dodaj tę dodatkową linię na początku metody, jeśli podajesz daty, które mają czas, w przeciwnym razie „wczoraj” może nie działać: tm = DateTime (tm.year, tm.month, tm.day);
Nick Wright
8

Istnieje pakiet date_format

dependencies:
    date_format:

kod

import 'package:date_format/date_format.dart';

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

// output example "29.03.19 07:00"

Uwaga: minuty to nn

link do pakietu

Andrzej
źródło
5

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
}

Wynik:

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
miłość na żywo
źródło
4

Możesz również użyć tej metody, jeśli nie chcesz dodawać kolejnej biblioteki

  DateTime dateTime = DateTime.now();
  String YYYY_MM_DD = dateTime.toIso8601String().split('T').first;
  print(YYYY_MM_DD);

Siddharth Chandra
źródło
2

obsługując kwartały roczne, od stringa do DateTime, nie znalazłem odpowiedniego rozwiązania, więc zrobiłem to:

    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
źródło
1

W przypadku, gdy chcesz połączyć kilka formatów daty w jeden, oto jak możemy to zrobić za pomocą intl.

DateFormat('yMMMd').addPattern(DateFormat.HOUR24_MINUTE).format(yourDateTime))
brianLikeApple
źródło
1
String formatDate(String date) {
    return date.substring(0, 10).split('-').reversed.join().replaceAll('-', '/');
    
  }

Z formatu „rrrr-mm-dd H: i: s”

Rodrigo Bueno
źródło
String formatDate (String date) {return date.substring (0, 10) .split ('-'). Reverse.join ('-'). ReplaceAll ('-', '/'); }
Rodrigo Bueno
1
Jeśli masz aktualizację swojej odpowiedzi, zmień ją zamiast zostawiać aktualizacje w komentarzu.
Jeremy Caney
0
import 'package:intl/intl.dart';

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

Więcej informacji można znaleźć w dokumentacji DateFormat

Srinath Kalikivayi
źródło