如何在 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-23
、1999-04-23 13:45:56Z
、19990423T134556.789
。在这种情况下,您可以使用DateTime.parse
或DateTime.tryParse
。 (请参阅the DateTime.parse
documentation 了解允许输入的精确设置。)
您的时间戳位于standard HTTP format。 示例:Fri, 23 Apr 1999 13:45:56 GMT
、Friday, 23-Apr-99 13:45:56 GMT
、Fri Apr 23 13:45:56 1999
。在这种情况下,您可以使用dart:io
的HttpDate.parse
函数。
您的时间戳采用某种本地格式。示例:23/4/1999
、4/23/99
、April 23, 1999
。您可以使用package:intl
的DateFormat
类并提供一个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:intl
、yy
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 对象?的主要内容,如果未能解决你的问题,请参考以下文章
如何在android中将日期转换为firebase时间戳格式