¿Cómo formateo una fecha con Dart?


141

Tengo una instancia de DateTimey me gustaría formatearla en una cadena. ¿Cómo puedo hacer eso? Quiero convertir la fecha en una cadena, algo así como "2013-04-20".

Respuestas:


298

Puede usar el intlpaquete ( instalador ) para formatear fechas.

Para en_USformatos, es bastante 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
}

Hay muchas opciones para formatear. De los documentos:

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

Para las no en_USfechas, debe cargar explícitamente en la configuración regional. Vea los DateFormatdocumentos para más información. El date_symbol_data_local.dartcontiene todos los formatos para cada país / idioma, si se desea un análisis más en profundidad.


¿Intl está roto? Error no detectado: FileSystemException: No se puede abrir el archivo, ruta = 'E: \ dart \ ws \ web \ packages \ intl \ intl.dart' (Error del sistema operativo: el sistema no puede encontrar la ruta especificada.
javapadawan

1
¿Hay alguna forma de agregar milisegundos al formato?
Kaspi

2
requiere en dependencias pubspec.yaml: Intl: ^ 0.15.7
murt

¿Cómo podemos obtener solo mes, por ejemplo 1 para enero, 2 para febrero ...? He intentado con DateFormat ('MM'). format (DateTime.now ()); pero no funciona en aleteo. Por favor comparte tu sugerencia.
Kamlesh

@Kaspi prueba 'S' por fracción de segundo
badelectron77

32

Esto también funcionará:

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

Si alguien quiere convertir una fecha en formato de cadena a otro formato de cadena, primero use DateTime.parse ("2019-09-30") y luego páselo a DateFormat ("patrón de fecha"). Format () como

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

Referencia: Dart: cómo cambiar el formato de la cadena de fecha simple que está en aaaa-MM-dd a dd-MM-aaaa


1
su código usa DateFormatpero su texto diceDateTime.format()
mFeinstein

¡Uy! una torpeza. Cambiado :)
Shashank

11

Esto le da la fecha como en una red social: ["hoy", "ayer", "día de la semana", 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}';
      }
    }

1
Muy útil, gracias. Agregue esta línea adicional en la parte superior del método si está pasando fechas que tienen una hora, de lo contrario, 'ayer' podría no funcionar: tm = DateTime (tm.year, tm.month, tm.day);
Nick Wright

8

Hay un paquete date_format

dependencies:
    date_format:

código

import 'package:date_format/date_format.dart';

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

// output example "29.03.19 07:00"

Presta atención: los minutos son nn

enlace al paquete


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
}

Resultado:

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

En el caso de que desee combinar varios formatos de fecha en uno, así es como podemos hacerlo usando intl.

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


0

manejando trimestres anuales, desde la cadena hasta DateTime, no encontré la solución adecuada, así que hice esto:

    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;
    }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.