如何在 Dart 中将日期/时间字符串转换为 DateTime 对象?

Posted

技术标签:

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

假设我有一个字符串

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

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

【问题讨论】:

【参考方案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 限制:

DateFormat cannot parse dates that lack explicit field separators。对于这种情况,您可以求助于使用正则表达式(见下文)。 在 package:intlyy did not follow the -80/+20 rule 的 0.17.0 版本之前,该文档描述了用于推断世纪,因此如果您使用 2 位数年份,您可能需要在之后调整世纪。 截至发稿时,DateFormat does not support time zones。如果您需要处理时区问题,请you will need to handle them separately。

不得已:如果您的时间戳采用固定、已知的数字格式,您始终可以使用正则表达式手动解析它们:

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://***.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("$strDtZ");

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

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”包。

【讨论】:

以上是关于如何在 Dart 中将日期/时间字符串转换为 DateTime 对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在dart中将字符串转换为小时?

如何在android中将日期转换为firebase时间戳格式

如何在Dart中将UTF-8字符串转换为字节数组?

在Android中将字符串日期转换为时间戳?

如何在 Dart/Flutter 中将数字从 20,95 转换为 20.95?

如何在python中将字符串日期转换为日期时间格式? [复制]