Reputation: 10421
Say I have a string
"1974-03-20 00:00:00.000"
It is created using DateTime.now()
,
how do I convert the string back to a DateTime
object?
Upvotes: 166
Views: 188823
Reputation: 90015
There seem to be a lot of questions about parsing timestamp strings into DateTime
. I will try to give a more general answer so that future questions can be directed here.
Your timestamp is in an ISO format. Examples: 1999-04-23
, 1999-04-23 13:45:56Z
, 19990423T134556.789
. In this case, you can use DateTime.parse
or DateTime.tryParse
. (See the DateTime.parse
documentation for the precise set of allowed inputs.)
Your timestamp is in a standard HTTP format. Examples: Fri, 23 Apr 1999 13:45:56 GMT
, Friday, 23-Apr-99 13:45:56 GMT
, Fri Apr 23 13:45:56 1999
. In this case, you can use dart:io
's HttpDate.parse
function.
Your timestamp is in some local format. Examples: 23/4/1999
, 4/23/99
, April 23, 1999
. You can use package:intl
's DateFormat
class and provide a pattern specifying how to parse the string:
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));
See the DateFormat
documentation for more information about the pattern syntax.
DateFormat
limitations:
DateFormat
cannot parse dates that lack explicit field separators. For such cases, you can use FixedDateTimeFormatter
(see below).package:intl
, yy
did not follow the -80/+20 rule that the documentation describes for inferring the century, so if you use a 2-digit year, you might need to adjust the century afterward.DateFormat
does not support time zones. If you need to deal with time zones, you will need to handle them separately.Your timestamp is in a fixed, known, numeric format. Examples: 19990423
, 04-23-1999
. You can use package:convert
's FixedDateTimeFormatter
and provide a pattern specifying how to parse the string:
import 'package:convert/convert.dart';
...
var dateString = '19990423';
var dateTime = FixedDateTimeFormatter ('YYYYMMDD').decode(dateString);
(Note that FixedDateTimeFormatter
and DateFormat
use different patterns.)
As a last resort, you always use regular expressions to parse such strings manually:
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')!),
);
See https://stackoverflow.com/a/63402975/ for another example.
(I mention using regular expressions for completeness. There are many more points for failure with this approach, so I do not recommend it unless there's no other choice. DateFormat
or FixedDateTimeFormatter
usually should be sufficient.)
Upvotes: 104
Reputation: 181
All the previous answers are appreciated. However I would like to introduce the flutter_helper_utils package's helper method toDateTime
and tryToDateTime
which takes dynamic data and atemp to convert it into DateTime
object (useful when dealing with API data like List or Map<String, dynamic>).
import 'package:flutter_helper_utils/flutter_helper_utils.dart';
final dateTime = toDateTime('12/11/2020'); // or tryToDateTime
// or specify an optional format and locale.
final dateTime = toDateTime('12/11/2020', format: 'yyyy-MM-dd', locale: 'en_US');
// or if the global method name conflicts with any of your methods.
final dateTime = ConvertObject.toDateTime('12/11/2020');
both global methods and static ones behaves the same.
it also contains a lot of useful conversion methods and extensions.
you can check its documentation website here
Upvotes: 0
Reputation: 1
String dateFormatter(date) {
date = date.split('-'); DateFormat dateFormat = DateFormat("yMMMd"); String format = dateFormat.format(DateTime(int.parse(date[0]), int.parse(date[1]), int.parse(date[2]))); return format; }
Upvotes: 0
Reputation: 7105
a string can be parsed to DateTime object using Dart default function DateTime.parse("string");
final parsedDate = DateTime.parse("1974-03-20 00:00:00.000");
Upvotes: 3
Reputation: 656
you can just use : DateTime.parse("your date string");
for any extra formating, you can use "Intl" package.
Upvotes: 4
Reputation: 59
void main() {
var dateValid = "30/08/2020";
print(convertDateTimePtBR(dateValid));
}
DateTime convertDateTimePtBR(String validade)
{
DateTime parsedDate = DateTime.parse('0001-11-30 00:00:00.000');
List<String> validadeSplit = validade.split('/');
if(validadeSplit.length > 1)
{
String day = validadeSplit[0].toString();
String month = validadeSplit[1].toString();
String year = validadeSplit[2].toString();
parsedDate = DateTime.parse('$year-$month-$day 00:00:00.000');
}
return parsedDate;
}
Upvotes: 2
Reputation: 327
import 'package:intl/intl.dart';
DateTime brazilianDate = new DateFormat("dd/MM/yyyy").parse("11/11/2011");
Upvotes: 9
Reputation: 1150
I solved this by creating, on the C# server side, this attribute:
using Newtonsoft.Json.Converters;
public class DartDateTimeConverter : IsoDateTimeConverter
{
public DartDateTimeConverter()
{
DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFK";
}
}
and I use it like this:
[JsonConverter(converterType: typeof(DartDateTimeConverter))]
public DateTimeOffset CreatedOn { get; set; }
Internally, the precision is stored, but the Dart app consuming it gets an ISO8601
format with the right precision.
HTH
Upvotes: -5
Reputation: 657496
DateTime
has a parse
method
var parsedDate = DateTime.parse('1974-03-20 00:00:00.000');
https://api.dartlang.org/stable/dart-core/DateTime/parse.html
Upvotes: 274