在JavaScript或Moment.js中获取给定的日期格式(指定格式的字符串)

9
给定一个日期字符串,如何获取描述该日期字符串的格式字符串?
换句话说,如果没有传递明确的格式来使用,如何获取Date()或MomentJS将用于解析该日期字符串的格式字符串(每个都可能不同,这没关系)?
因此,给定'2016-01-01',它应该输出类似于'YYYY-MM-DD'的内容。
(我知道这是一个简单的问题,可能有答案,但很难简洁地表达,因此我只能找到有关如何解析日期字符串或如何显示日期的问题和答案。没有关于如何输出格式本身的问题。)
2个回答

14

Matt Johnson的答案、一些评论和我的贡献中整合信息。

使用Moment.js(版本2.10.7+),您可以使用Creation Data API。在Node.js中可以这样实现:

moment('2016-01-01 00:00:00').creationData().format

输出

'YYYY-MM-DD HH:mm:ss'

就像任何日期解析一样,由于诸如语言环境(例如美国和欧洲之间月份和日期顺序的不同),许多日期字符串的格式存在歧义。但是上述方法对我来说已经足够了。


4
没有其他信息,比如所在地区,你无法确定日期格式。例如,01/12/16 可以是2016年1月12日、2016年12月1日或2001年12月16日。
即使你知道所在地区,现实世界中也有几个地方会根据上下文使用多种日期格式。
请参见 https://en.wikipedia.org/wiki/Date_format_by_country 然而,如果你只是想确定输入字符串使用了多个已知格式中的哪一个,moment提供了一个API叫做Creation Data。例如:
var m = moment("2016/06/10", ["YYYY-MM-DD", "MM/DD/YYYY"], true);
var f = m.creationData().format;  // "MM/DD/YYYY"

当然可以,但是必须能够选择其中一个选项,因为它们可以解析这些字符串。所以,是的,存在歧义,但是可以做出选择,并且已经隐含地做出了选择,因为解析器已经存在。 - tscizzle
我认为在这里使用“格式”比“区域设置”更合适,因为源和目标系统的位置可能并没有太大帮助。;-) - RobG
@tscizzle,如果没有格式,你只是在猜测。虽然某些格式比其他格式更有“成功”的机会,但像03/04/05这样的字符串可以解析出至少3个有效但不同的日期。请参见当回退到Date构造函数时要小心(可能应该是*...回退到Date.parse*)。 - RobG
@tscizzle - 看看我的更新答案 - 或许那会对你有所帮助。 - Matt Johnson-Pint
确实有帮助,谢谢!但是你需要知道的是,它确实按照我最初想要的方式工作 :) 也就是说,你不必传递多个已知格式。这个代码完美地运行:moment('2016-01-01 00:00:00').creationData().format。它输出 "YYYY-MM-DD HH:mm:ss" - tscizzle
是的,但要小心。这仅适用于您的输入是支持的格式之一在此处列出。如果您传递其他任何内容,它将内部回退到Date对象的构造函数,您将在调试控制台中收到警告消息,并且您会发现creationData().format返回undefined。另请参见http://momentjs.com/guides/#/warnings/。 - Matt Johnson-Pint

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接