152

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?

jamesdlin
  • 81,374
  • 13
  • 159
  • 204
Daniel Mana
  • 9,451
  • 13
  • 29
  • 41

8 Answers8

255

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

furins
  • 4,979
  • 1
  • 39
  • 57
Günter Zöchbauer
  • 623,577
  • 216
  • 2,003
  • 1,567
92

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:

  • Last resort: If your timestamps are in a fixed, known, numeric format, you always can use regular expressions to parse them 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 usually should be sufficient.)

jamesdlin
  • 81,374
  • 13
  • 159
  • 204
  • DateFormat('d/M/yyyy').parse('2020-10-22 16:17:18'); did not work for me. any suggestion. – Kamlesh Oct 22 '20 at 17:51
  • @Kamlesh Of course that didn't work; that format doesn't match the parsed string at all. `d/M/yyyy` means day, month, 4-digit year, separated by slashes. You want something like `yyyy-MM-dd HH:mm:ss`. However, since that's an ISO format, you could just use `DateTime.parse`. – jamesdlin Oct 22 '20 at 18:11
  • 1
    Shouldn't something like the fact that "DateFormat cannot parse dates that lack explicit field separators" be at least mentioned in the docs? Seems to me an important note to add... – il_boga Oct 27 '20 at 13:43
8
import 'package:intl/intl.dart';

DateTime brazilianDate = new DateFormat("dd/MM/yyyy").parse("11/11/2011");
β.εηοιτ.βε
  • 33,893
  • 13
  • 69
  • 83
Bruno Camargos
  • 189
  • 1
  • 5
  • 4
    While this code may answer the question, providing additional context regarding why and/or how this code answers the question improves its long-term value. – β.εηοιτ.βε Aug 05 '20 at 17:42
3

you can just use : DateTime.parse("your date string");

for any extra formating, you can use "Intl" package.

akash maurya
  • 607
  • 9
  • 16
3

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"); 

Example on Dart Pad

enter image description here

Javeed Ishaq
  • 6,024
  • 6
  • 41
  • 60
2

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

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

-6

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

Bill Noel
  • 1,120
  • 9
  • 21