说我有一个字符串
"1974-03-20 00:00:00.000"
它是使用DateTime.now()
创建的,
如何将字符串转换回DateTime
对象?
答案 0 :(得分:26)
似乎有很多关于将时间戳字符串解析为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
的{{3}}函数。
您的时间戳采用某种本地格式。示例:23/4/1999
,4/23/99
,April 23, 1999
。您可以使用HttpDate.parse
的package: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
的局限性:
DateFormat
documentation。DateFormat
cannot parse dates that lack explicit field separators由文档描述,用于推断世纪,因此,如果使用两位数的年份,则可能需要在以后调整世纪。)yy
does not seem to follow the -80/+20 rule。如果您需要处理时区,请DateFormat
does not support time zones。最后的选择::如果时间戳为固定的已知数字格式,则始终可以使用正则表达式手动对其进行解析:
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