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

时间:2018-03-20 13:17:09

标签: datetime dart

说我有一个字符串

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

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

7 个答案:

答案 0 :(得分:26)

似乎有很多关于将时间戳字符串解析为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:io的{​​{3}}函数。

  • 您的时间戳采用某种本地格式。示例:23/4/19994/23/99April 23, 1999。您可以使用HttpDate.parsepackage:intl类并提供一个 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));
    

    有关模式语法的更多信息,请参见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')),
    );
    

    另请参见you will need to handle them separately

    (我提到使用正则表达式来保证完整性。这种方法还有很多缺点,因此,除非没有其他选择,否则我建议这么做。DateFormat通常应该足够。)

答案 1 :(得分:20)

DateTime有一个parse方法

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

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

答案 2 :(得分:0)

import 'package:intl/intl.dart';

DateTime brazilianDate = new DateFormat("dd/MM/yyyy").parse("11/11/2011");

答案 3 :(得分:0)

大多数时候,来自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

答案 4 :(得分:0)

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

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

答案 5 :(得分:-1)


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 :(得分:-2)

我通过在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