【问题标题】:How do I convert a date/time string to a DateTime object in Dart?如何在 Dart 中将日期/时间字符串转换为 DateTime 对象?
【发布时间】:2018-08-29 07:57:33
【问题描述】:

假设我有一个字符串

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

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

【问题讨论】:

    标签: datetime dart


    【解决方案1】:

    DateTime 有一个parse 方法

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

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

    【讨论】:

    • 不支持“2019-02-14T16:27:30.1519239+03:30”,因为该正则表达式仅支持 6 位毫秒而不是 7 位
    • 是的,我收到以下错误:FormatException: Invalid date format here is the date as a string : 2019-08-01T08:06:10.7790549Z
    • 如果遇到同样的错误,请尝试将T 替换为` `(空格)?
    • @GünterZöchbauer 是的,仍然出现同样的错误 - 这是我尝试过的 DateTime.parse("2019-07-31 11:25:46.2265012Z");错误:“无效的日期格式 2019-07-31 11:25:46.2265012Z”
    • 我刚刚在dartpad.dartlang.org 中尝试过。您可以保留T,但您必须从秒小数中删除一位数字(Z 之前的最后一位数字)。
    【解决方案2】:

    似乎有很多关于将时间戳字符串解析为DateTime 的问题。我会尽量给出一个更笼统的答案,以便将来的问题可以在这里提出。

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

    • 您的时间戳位于standard HTTP format 示例: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 类并提供一个pattern 指定如何解析字符串:

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

      有关模式语法的更多信息,请参阅the DateFormat documentation

      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')!),
      );
      

      另一个例子见https://stackoverflow.com/a/63402975/

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

    【讨论】:

    • DateFormat('d/M/yyyy').parse('2020-10-22 16:17:18');对我不起作用。任何建议。
    • @Kamlesh 当然没用;该格式根本与解析的字符串不匹配。 d/M/yyyy 表示日、月、4 位数的年份,以斜线分隔。你想要像yyyy-MM-dd HH:mm:ss 这样的东西。但是,由于这是 ISO 格式,您可以使用 DateTime.parse
    • 不应该在文档中至少提到“DateFormat 无法解析缺少明确字段分隔符的日期”这样的事实吗?在我看来,要添加一个重要说明...
    【解决方案3】:

    我通过在 C# 服务器端创建这个属性来解决这个问题:

    using Newtonsoft.Json.Converters;
    
    public class DartDateTimeConverter : IsoDateTimeConverter
    {
        public DartDateTimeConverter() 
        {
            DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFK";
        }
    }
    

    我是这样使用它的:

    [JsonConverter(converterType: typeof(DartDateTimeConverter))]
    public DateTimeOffset CreatedOn { get; set; }
    

    在内部存储精度,但使用它的 Dart 应用程序会获得具有正确精度的 ISO8601 格式。

    HTH

    【讨论】:

      【解决方案4】:
      import 'package:intl/intl.dart';
      
      DateTime brazilianDate = new DateFormat("dd/MM/yyyy").parse("11/11/2011");
      

      【讨论】:

      • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
      【解决方案5】:
      
      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;
      }
      
      

      【讨论】:

        【解决方案6】:

        大多数时候,来自 api 响应的 date 位于 String 中,我们需要将其转换为 DateTime 对象。我们可以使用parse() 方法来实现这一点,该方法将字符串作为参数,如下所示:

          String strDt = "1974-03-20 00:00:00.000";
          DateTime parseDt = DateTime.parse(strDt);
          print(parseDt); // 1974-03-20 00:00:00.000
        

        如果您在日期字符串的末尾添加'Z',以便将其解析为 UTC 时间。

        DateTime createdUTCDt = DateTime.parse("${strDt}Z");
        

        如果要解析特定的自定义日期时间。下面是一个演示如何做到这一点的示例

        final dateStr = 'October 15, 2020 at 9:44:45 AM UTC+7';
        final formatter = DateFormat(r'''MMMM dd, yyyy 'at' hh:mm:ss a Z''');
        
        final dateTimeFromStr = formatter.parse(dateStr);
        
        print(dateTimeFromStr); // 2020-10-15 09:44:45.000
        

        【讨论】:

          【解决方案7】:

          你可以使用:DateTime.parse("your date string");

          对于任何额外的格式,您可以使用“Intl”包。

          【讨论】:

            猜你喜欢
            • 2012-08-13
            • 2022-01-23
            • 1970-01-01
            • 2023-04-09
            • 2013-05-04
            • 2012-05-24
            • 2014-12-13
            相关资源
            最近更新 更多