Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 在dart中解析任意日期格式_Date_Parsing_Dart_Format - Fatal编程技术网

Date 在dart中解析任意日期格式

Date 在dart中解析任意日期格式,date,parsing,dart,format,Date,Parsing,Dart,Format,我正在开发一个应用程序,它应该接受任意格式的日期——换句话说,如果它走路像日期,说话像日期,它就是日期 我曾尝试调整moment.js包中的日期格式解析器,以生成一个格式字符串,但取得了部分成功,但遇到了这样的情况:其中的输入字符串包含一些无法识别的元素 例如,似乎没有适当的格式来处理字符串 2019年11月7日星期四13:50:03 GMT-0800(太平洋标准时间) --或者,至少有一个对我来说似乎很清楚,但也许我在文档中遗漏了一些东西 我已经看过了,但我看不到任何方法,例如,忽略可能不相关

我正在开发一个应用程序,它应该接受任意格式的日期——换句话说,如果它走路像日期,说话像日期,它就是日期

我曾尝试调整moment.js包中的日期格式解析器,以生成一个格式字符串,但取得了部分成功,但遇到了这样的情况:其中的输入字符串包含一些无法识别的元素

例如,似乎没有适当的格式来处理字符串

2019年11月7日星期四13:50:03 GMT-0800(太平洋标准时间)

--或者,至少有一个对我来说似乎很清楚,但也许我在文档中遗漏了一些东西

我已经看过了,但我看不到任何方法,例如,忽略可能不相关的字段或正确编码格式(例如
GMT-0800
字段)

我正在使用jiffy包进行日期解析,如果这很重要的话

跟进:我怀疑我要寻找的是某种或多或少类似于C语言中的
strtime()
的东西。也许不是

如果它走路像约会,说话像约会,那就是约会

问题是没有这样的走路方式或约会方式。

日期在任何语言中都很难正确地实现,因为没有规则确切地定义人类应该如何格式化日期。 你所要求的“任意格式的日期”,它们没有多大价值,因为它们不能以可预测的方式表示实际日期。 在这里查看,以便获得一个透视图

使用Dart DateTime类,您只能通过解析符合

如何从“任意”输入中获得这样的字符串必须由您定义

您可以使用一些预定义的常量来提高代码的可读性, 但是直接使用DateTime类需要编写一些非常酷的代码,将世界上任何地方对日期的任何可能感知提取并格式化为正确的语法,以便创建可用的DateTime对象。 也许创建一个日期输入AI

幸运的是,您可以使用您提到的类来完成很多繁重的工作:,这就是我攻击它的方式

它可以帮助您从输入中格式化本地化的日期字符串,然后,再加上一些正则表达式,如果您根据应用程序域的“正常值范围”对此进行验证,您应该能够实现所需的功能


但确切的逻辑是最好自己创建,因为每个案例/应用程序都会有所不同。

基本答案,正如我在对cseder的评论中提到的,是根据文档将日期字符串的无趣标记封装在单引号中

例如,格式

EEE MMM DD yyyy H:mm:ss“GMT-0800”(太平洋标准时间)

快乐地解析字符串

2019年11月7日星期四13:50:03 GMT-0800(太平洋标准时间)

我可能也能处理时区问题,但这需要解决眼前的问题。

。但请注意,接受完全任意的格式可能是不明确的:是
01-02-2020
代表2020年1月2日(典型的美国公约)还是2020年2月1日(世界大多数其他地区)

在您描述的特定情况下,我将首先(或从
.split(“”)
)使用
RegExp
来分解字符串,以分离
DateFormat
可以处理的位(基本上是时区以外的所有东西,它可以处理)。虽然您可以使用
DateFormat
的转义文本机制忽略时区,但只有在时区保证永不更改的情况下,这才有效。即使字符串来自固定位置的服务器,
GMT-0800(PST)
如果夏令时生效,也可能更改为
GMT-0700(PDT)

您可以使用
RegExp
手动解析时区本身,也可以使用from
package:timezone

我认为以下代码应该将字符串解析为UTC
DateTime
对象:

DateTime解析日期(字符串时间戳){
最终re=RegExp(“”)
r'^(?\w{3}\w{3}\d{2}\d{4}\d{2}:\d{2}:\d{2})'
r'\w{3}(?[+-]\d{4}'
r.*$);
最终匹配=重新匹配firstMatch(时间戳);
if(match==null){
抛出FormatException('未能分析时间戳:$timestamp');
}
final rawOffsetFromGMT=int.parse(match.namedGroup('offset'));
最终偏移量FromGMT=持续时间(
小时数:rawOffsetFromGMT~/100,
分钟:rawOffsetFromGMT。余数(100),
);
返回日期格式('EEE MMM DD yyyy H:mm:ss')
.解析(
match.namedGroup('datetime'),
是的,
)
.减去(从GMT中抵消);
}
void main(){
打印(日期(2019年11月7日星期四13:50:03 GMT-0800(太平洋标准时间));
}

Thanx。正如我所提到的,我已经移植了moment.js的日期格式生成器,它生成了一个格式字符串,然后可以应用到所讨论的字符串中,从而生成一个DateTime对象,作为对您努力的回报。我遗漏了(文档中也确实遗漏了)未解析文本的文本转义。将GMT-0800封装在“GMT-0800”中,再加上解析器中的一些额外逻辑,完成了这项工作。谢谢。我完全理解日期解析中的歧义。相信我,我有战斗的伤疤来证明这一点。我的问题很简单,我错过了关于字符串转义的文档中的一个要点,是的,我认识到这不是一个通用的解决方案——它只是让我克服了一个直接的困难,我以后必须返回并对代码做进一步的补充。是的,基于一个简化的、人为的、定制的现实,这就足够了。除了“简化的、人工的、定制的现实”之外,什么是编程呢?对于任何冒犯我的行为,我深表歉意。是的,不是的。这是因为它处理spe