¿Cómo convierto una cadena de fecha/hora en un objeto DateTime en Dart?

Resuelto Daniel Mana asked hace 6 años • 9 respuestas

Di que tengo una cuerda

"1974-03-20 00:00:00.000"

Se crea usando DateTime.now(), ¿cómo convierto la cadena nuevamente en un DateTimeobjeto?

Daniel Mana avatar Mar 20 '18 20:03 Daniel Mana
Aceptado

DateTimetiene un parsemétodo

var parsedDate = DateTime.parse('1974-03-20 00:00:00.000');

https://api.dartlang.org/stable/dart-core/DateTime/parse.html

Günter Zöchbauer avatar Mar 20 '2018 13:03 Günter Zöchbauer

Parece haber muchas preguntas sobre el análisis de cadenas de marca de tiempo en archivos DateTime. Intentaré dar una respuesta más general para que futuras preguntas puedan dirigirse aquí.

  • Su marca de tiempo está en formato ISO. Ejemplos: 1999-04-23, 1999-04-23 13:45:56Z, 19990423T134556.789. En este caso, puedes utilizar DateTime.parseo DateTime.tryParse. (Consulte la DateTime.parsedocumentación para conocer el conjunto preciso de entradas permitidas).

  • Su marca de tiempo está en un formato HTTP estándar . Ejemplos: Fri, 23 Apr 1999 13:45:56 GMT, Friday, 23-Apr-99 13:45:56 GMT, Fri Apr 23 13:45:56 1999. En este caso, puede utilizar dart:iola HttpDate.parsefunción.

  • Su marca de tiempo está en algún formato local. Ejemplos: 23/4/1999, 4/23/99, April 23, 1999. Puede usar package:intlla DateFormatclase y proporcionar un patrón que especifique cómo analizar la cadena:

    import 'package:intl/intl.dart';
    
    ...
    
    var dmyString = '23/4/1999';
    var dateTime1 = DateFormat('d/M/y').parse(dmyString);
    
    var mdyString = '04/23/99'; 
    var dateTime2 = DateFormat('MM/dd/yy').parse(mdyString);
    
    var mdyFullString = 'April 23, 1999';
    var dateTime3 = DateFormat('MMMM d, y', 'en_US').parse(mdyFullString));
    

    Consulte la DateFormatdocumentación para obtener más información sobre la sintaxis del patrón.

    DateFormatlimitaciones:

    • DateFormatNo se pueden analizar fechas que carezcan de separadores de campos explícitos . Para tales casos, puede utilizar FixedDateTimeFormatter(ver más abajo).
    • Antes de la versión 0.17.0 de package:intl, yyno seguía la regla -80/+20 que la documentación describe para inferir el siglo, por lo que si usa un año de 2 dígitos, es posible que deba ajustar el siglo después.
    • Al momento de escribir este artículo, DateFormatno admite zonas horarias . Si necesita tratar con zonas horarias, deberá hacerlo por separado .
  • Su marca de tiempo está en un formato numérico fijo y conocido. Ejemplos: 19990423, 04-23-1999. Puede usar package:convert's FixedDateTimeFormattery proporcionar un patrón que especifique cómo analizar la cadena:

    import 'package:convert/convert.dart';
    
    ...
    
    var dateString = '19990423';
    var dateTime = FixedDateTimeFormatter ('YYYYMMDD').decode(dateString);
    

    (Tenga en cuenta esto FixedDateTimeFormattery DateFormatuse diferentes patrones).

    Como último recurso , siempre utilice expresiones regulares para analizar dichas cadenas manualmente:

    var dmyString = '23/4/1999';
    
    var re = RegExp(
      r'^'
      r'(?<day>[0-9]{1,2})'
      r'/'
      r'(?<month>[0-9]{1,2})'
      r'/'
      r'(?<year>[0-9]{4,})'
      r'$',
    );
    
    var match = re.firstMatch(dmyString);
    if (match == null) {
      throw FormatException('Unrecognized date format');
    }
    
    var dateTime4 = DateTime(
      int.parse(match.namedGroup('year')!),
      int.parse(match.namedGroup('month')!),
      int.parse(match.namedGroup('day')!),
    );
    

    Consulte https://stackoverflow.com/a/63402975/ para ver otro ejemplo.

    (Menciono el uso de expresiones regulares para completar. Hay muchos más puntos de falla con este enfoque, por lo que no lo recomiendo a menos que no haya otra opción DateFormato , FixedDateTimeFormatterpor lo general, debería ser suficiente).

jamesdlin avatar Apr 23 '2020 18:04 jamesdlin
import 'package:intl/intl.dart';

DateTime brazilianDate = new DateFormat("dd/MM/yyyy").parse("11/11/2011");
Bruno Camargos avatar Aug 05 '2020 15:08 Bruno Camargos

puedes usar simplemente:DateTime.parse("your date string");

para cualquier formato adicional, puede utilizar el paquete "Intl".

akash maurya avatar May 01 '2021 17:05 akash maurya