¿Cómo convierto una cadena de fecha/hora en un objeto DateTime en Dart?
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 DateTime
objeto?
DateTime
tiene un parse
método
var parsedDate = DateTime.parse('1974-03-20 00:00:00.000');
https://api.dartlang.org/stable/dart-core/DateTime/parse.html
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 utilizarDateTime.parse
oDateTime.tryParse
. (Consulte laDateTime.parse
documentació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 utilizardart:io
laHttpDate.parse
función.Su marca de tiempo está en algún formato local. Ejemplos:
23/4/1999
,4/23/99
,April 23, 1999
. Puede usarpackage:intl
laDateFormat
clase 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
DateFormat
documentación para obtener más información sobre la sintaxis del patrón.DateFormat
limitaciones:DateFormat
No se pueden analizar fechas que carezcan de separadores de campos explícitos . Para tales casos, puede utilizarFixedDateTimeFormatter
(ver más abajo).- Antes de la versión 0.17.0 de
package:intl
,yy
no 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,
DateFormat
no 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 usarpackage:convert
'sFixedDateTimeFormatter
y 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
FixedDateTimeFormatter
yDateFormat
use 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
DateFormat
o ,FixedDateTimeFormatter
por lo general, debería ser suficiente).
import 'package:intl/intl.dart';
DateTime brazilianDate = new DateFormat("dd/MM/yyyy").parse("11/11/2011");
puedes usar simplemente:DateTime.parse("your date string");
para cualquier formato adicional, puede utilizar el paquete "Intl".