Come posso formattare una data con Dart?


141

Ho un'istanza di DateTimee vorrei formattarla in una stringa. Come lo faccio? Voglio trasformare la data in una stringa, qualcosa del tipo "20-04-2013".

Risposte:


298

È possibile utilizzare il intlpacchetto (programma di installazione ) per formattare le date.

Per i en_USformati, è abbastanza semplice:

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
}

Esistono molte opzioni per la formattazione. Dai documenti:

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

Per le non en_USdate, è necessario caricare esplicitamente le impostazioni internazionali. Vedi i DateFormatdocumenti per maggiori informazioni. Il date_symbol_data_local.dartcontiene tutti i formati per ogni paese / lingua, se desideri un aspetto più approfondito.


Intl è rotto? Errore non rilevato: FileSystemException: impossibile aprire il file, path = 'E: \ dart \ ws \ web \ pacchetti \ intl \ intl.dart' (Errore del sistema operativo: il sistema non riesce a trovare il percorso specificato.
javapadawan

1
C'è un modo per aggiungere millisecondi al formato?
Kaspi,

2
richiede nelle dipendenze pubspec.yaml: intl: ^ 0.15.7
murt

come possiamo recuperare solo mese ad es. 1 per gennaio, 2 per febbraio ...? ho provato DateFormat ('MM'). format (DateTime.now ()); ma non funziona in flutter. Si prega di condividere il tuo suggerimento.
Kamlesh,

@Kaspi prova 'S' per il secondo frazionario
badelectron77

32

Funzionerà anche questo:

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


13

Se qualcuno vuole convertire una data in formato stringa in un altro formato stringa, utilizza prima DateTime.parse ("2019-09-30"), quindi passala a DateFormat ("modello data"). Format () come

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

Riferimento: Dart - Come modificare il formato della stringa di date semplice che è in aaaa-MM-gg in gg-MM-aaaa


1
il tuo codice usa DateFormatma il tuo testo diceDateTime.format()
mFeinstein

Oops! un errore. Modificato :)
Shashank l'

11

Questo ti dà la data come in un social network: ["oggi", "ieri", "dayoftheweek", ecc.]

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}';
      }
    }

1
Molto utile - grazie. Aggiungi questa riga aggiuntiva all'inizio del metodo se stai passando date che hanno un orario, altrimenti 'ieri' potrebbe non funzionare: tm = DateTime (tm.year, tm.month, tm.day);
Nick Wright,

8

C'è un pacchetto date_format

dependencies:
    date_format:

codice

import 'package:date_format/date_format.dart';

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

// output example "29.03.19 07:00"

Attenzione: i minuti sono nn

collegamento al pacchetto


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
}

Risultato:

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

Nel caso in cui desideri combinare diversi formati di data in uno, è così che possiamo fare usando intl.

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


0

gestendo i trimestri annuali, dalla stringa a DateTime, non ho trovato la soluzione adeguata, quindi ho fatto questo:

    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;
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.