我正在开发一个应用程序,它应该接受任意格式的日期 - 换句话说,如果它像日期一样走路,像日期一样说话,它就是一个日期。
我试图调整moment.js包中的日期格式解析器以生成格式字符串并取得部分成功,但遇到了输入字符串中包含一些无法识别的元素的情况。
例如,似乎没有合适的格式来处理字符串
Thu Nov 07 2019 13:50:03 GMT-0800(PST)
- 或者,至少有一个对我来说似乎很清楚,但也许我在文档中遗漏了一些东西。
我看了https://pub.dev/documentation/intl/latest/intl/DateFormat-class.html但我看不到任何方法,例如,忽略可能不相关的字段或正确编码格式(例如GMT-0800
字段)。
如果重要的话,我将使用jiffy包进行日期解析。
后续:我怀疑我要找的东西或多或少像C语言中的<code>strptime()
有多种方法可以解析不同的时间戳格式。但请注意,接受完全任意的格式可能是模棱两可的:01-02-2020
是代表2020年1月2日(典型的美国惯例)还是2020年2月1日(世界大多数其他地区)?
在您描述的特定情况下,我会先用< code>RegExp来拆分字符串(或from 。split(')
)来分隔< code>DateFormat可以处理的位(基本上是时区以外的所有内容,而< code>DateFormat不支持时区)。虽然您可以使用< code>DateFormat的机制来转义文字文本以忽略时区,但只有在时区保证永远不变的情况下,这种方法才有效。如果夏令时生效,即使字符串来自固定位置的服务器,< code>GMT-0800 (PST)也可能更改为< code>GMT-0700 (PDT)。
可以使用正则
表达式手动解析时区本身,也可以使用来自 package:timezone
的 TZDateTime.parse
。
我相信以下代码应该将字符串解析为UTCDateTime
对象:
DateTime parseDate(String timestamp) {
final re = RegExp(''
r'^(?<datetime>\w{3} \w{3} \d{2} \d{4} \d{2}:\d{2}:\d{2}) '
r'\w{3}(?<offset>[+-]\d{4}) '
r'.*$');
final match = re.firstMatch(timestamp);
if (match == null) {
throw FormatException('Failed to parse timestamp: $timestamp');
}
final rawOffsetFromGMT = int.parse(match.namedGroup('offset'));
final offsetFromGMT = Duration(
hours: rawOffsetFromGMT ~/ 100,
minutes: rawOffsetFromGMT.remainder(100),
);
return DateFormat('EEE MMM DD yyyy H:mm:ss')
.parse(
match.namedGroup('datetime'),
true,
)
.subtract(offsetFromGMT);
}
void main() {
print(parseDate('Thu Nov 07 2019 13:50:03 GMT-0800 (PST)'));
}
正如我在对cseder的评论中提到的,基本的答案是根据文档将日期字符串中不感兴趣的标记封装在单引号中。
例如,格式
EEE MMM DD yyyy H: mm: ss'GMT-0800''(PST)'
愉快地解析字符串
Thu Nov 07 2019 13:50:03 GMT-0800(PST)
我可能也可以处理时区问题,但这需要解决眼前的问题。
如果它走路像约会,说话像约会,那就是约会
问题是没有这样的走路方式或这样的约会。
在任何语言中正确实现日期都是一件麻烦的事情,因为没有规则定义人类应该如何精确地格式化日期。你所要求的“任意格式的日期”,嗯,它们没有多大价值,因为它们不能以可预测的方式表示实际的日期。在这里查看最新的日期/时间相关问题,以便获得一个视角!
使用 Dart DateTime 类,只能通过解析符合 ISO 8601 子集的格式正确的字符串来创建 DateTime 对象
如何从“任意”输入获得这样的字符串必须由您定义。
您可以使用一些预定义的常量来提高代码的可读性,但直接使用DateTime类需要您编写一些非常酷的代码,用于提取和格式化世界上任何地方的日期的任何可能感知到正确的语法中,以创建可用的DateTime对象。也许创建一个日期输入AI!
幸运的是,您可以使用您提到的类来完成许多繁重的工作:DateFormat类,这是我攻击它的方式。
它可以帮助您从输入中格式化本地化的日期字符串,然后再加上一些正则表达式,如果您基于应用程序域的“合理值范围”进行验证,您应该能够实现所需的功能。
但确切的逻辑是你最好自己创建,因为这会因情况/应用程序而异。
我想以yyyy-mm-dd格式存储今天的日期。在存储之前,我将今天的日期格式化,并再次解析格式化后的字符串。它以不同于我想要的格式给出了输出日期。我如何获得日期,将其格式化为' yyyy-mm-dd '并再次将其转换为日期,并希望输出格式为' yyyy-mm-dd '。请找到下面的代码,告诉我哪里错了 我得到的上述代码的输出是星期四 Mar 07 00:00:00 GMT 2013.但我希望输出为
问题内容: 我知道这个问题已经问了很多,显然你不能解析任何日期。但是,我发现python-dateutil库能够解析我向它抛出的每个日期,而在找出日期格式字符串方面绝对需要零的工作。Joda time始终被当作是出色的Java日期解析器而出售,但是它仍然需要你在选择格式(或创建自己的格式)之前确定日期的格式。你不能只调用DateFormatter.parse(mydate)并神奇地获取Date对象
在使用date格式自动设置为IE后,我试图解析某个包含日期条目为纪元数值的json文档。我需要不同的格式(也需要一毫秒) 所以问题是,如何解析IE。转换为带有Bson文档的某种自定义格式字符串。解析方法? 编辑:只是一个更新:问题在document.parse方法中,因为我不知道如何在解析json文档时使用tell.parse函数来使用自定义的日期格式。我总是得到某种默认的日期格式。如何发送给.p
问题内容: 我在中收到格式日期。我如何解析它得到和。 ISO格式的日期: 问题答案: 一些参考 http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html 希望能帮助到你
问题内容: 请像我在golang中帮助我解析日期 我正在尝试布局 但是编译器说 问题答案: 包装时间 导入“时间” [布局]参考时间可以认为是 使用,而不是。 例如, 游乐场:https : //play.golang.org/p/Xr8zaTjODgC 输出:
问题内容: 如何将以下内容转换为日期以插入/更新到MySQL中的or 字段? 用于格式化日期,但不能反之。 问题答案: 您可能要使用该功能。这是函数的逆函数。 STR_TO_DATE(str,format) 这是函数的逆函数。它需要一个字符串和一个格式字符串。如果格式字符串同时包含日期和时间部分,则返回一个值;如果格式字符串仅包含日期或时间部分,则返回一个或值。如果从中提取的日期,时间或日期时间值