在dart中将datetime字符串转换为datetime对象?

Dan*_*ana 22 datetime dart

说我有一个字符串

"1974-03-20 00:00:00.000"
Run Code Online (Sandbox Code Playgroud)

它是使用创建的DateTime.now(),如何将字符串转换回DateTime对象?

jam*_*lin 46

似乎有很多关于将时间戳字符串解析为DateTime. 我将尝试给出一个更笼统的答案,以便以后的问题可以指向这里。

  • 您的时间戳采用 ISO 格式。 示例:1999-04-231999-04-23 13:45:56Z19990423T134556.789。在这种情况下,您可以使用DateTime.parseDateTime.tryParse。(参见DateTime.parse文档的精确的设定的允许输入端。)

  • 您的时间戳采用标准 HTTP 格式示例:Fri, 23 Apr 1999 13:45:56 GMTFriday, 23-Apr-99 13:45:56 GMTFri Apr 23 13:45:56 1999。在这种情况下,您可以使用dart:ioHttpDate.parse功能。

  • 您的时间戳采用某种本地格式。 示例:23/4/19994/23/99April 23, 1999。你可以使用package:intlDateFormat类,并提供了一个模式,指定如何解析字符串:

    import 'package:intl/intl.dart';
    
    ...
    
    var dmyString = '23/4/1999';
    var dateTime1 = DateFormat('d/M/yyyy').parse(dmyString);
    
    var mdyString = '4/23/99'; 
    var dateTime2 = DateFormat('M/d/yy').parse(mdyString);
    
    var mdyFullString = 'April 23, 1999';
    var dateTime3 = DateFormat('MMMM d, yyyy', 'en_US').parse(mdyFullString));
    
    Run Code Online (Sandbox Code Playgroud)

    请参阅DateFormat文档有关模式语法的更多信息。

    DateFormat 限制:

  • 最后的手段:如果你的时间戳是固定的、已知的、数字格式,你总是可以使用正则表达式来手动解析它们:

    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')!),
    );
    
    Run Code Online (Sandbox Code Playgroud)

    另一个例子见/sf/answers/4438208281/

    (为了完整性,我提到使用正则表达式。这种方法还有很多失败的地方,所以我推荐它,除非没有其他选择。DateFormat通常应该足够了。)


Gün*_*uer 38

DateTime有一个parse方法

var parsedDate = DateTime.parse('1974-03-20 00:00:00.000');
Run Code Online (Sandbox Code Playgroud)

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

  • 不支持“ 2019-02-14T16:27:30.1519239 + 03:30”,因为该正则表达式仅支持6位数而不是7 (2认同)
  • 如果您遇到相同的错误,您可以尝试将“T”替换为“”(空格)吗? (2认同)

小智 10

import 'package:intl/intl.dart';

DateTime brazilianDate = new DateFormat("dd/MM/yyyy").parse("11/11/2011");
Run Code Online (Sandbox Code Playgroud)

  • 虽然此代码可以回答问题,但提供有关此代码为何和/或如何回答问题的附加上下文可以提高其长期价值。 (4认同)