【问题标题】:What date format to use in moment.js?在 moment.js 中使用什么日期格式?
【发布时间】:2016-10-02 22:07:07
【问题描述】:

我正在使用moment.js 获取 UTC 日期偏移量。

我有以下代码,它给了我偏移量,但我收到警告"Deprecation warning: moment construction falls back to js Date"

var s = booking.booking_date_time.toString();
console.log(moment(s).parseZone(s).utcOffset());

上面的s 变量设置为"Mon Jun 13 2016 08:00:00 GMT+1000 (AUS Eastern Standard Time)"

我知道要摆脱警告,我需要立即指定日期格式,但我不确定日期格式应该是什么。我已经尝试过这种格式"EEE MMM dd yyyy HH:mm:ss ZZ",但这不起作用。

【问题讨论】:

  • 采取相反的方法如何,格式化当前时间,直到它看起来与您输入的格式足够接近?
  • booking.booking_date_timeDate 对象吗?如果是这样,只需将其直接传递给时刻。无需遍历字符串。

标签: javascript date datetime momentjs


【解决方案1】:

Moment 使用它自己的解析令牌集,与其他库不同。因此,您在这里有一些错误的标记。此外,您需要指定 GMT 在字符串中,但用 [] 转义。

全部总结:

moment('Mon Jun 13 2016 08:00:00 GMT+1000', 'ddd MMM DD YYYY HH:mm:ss [GMT]ZZ').format()
"2016-06-12T17:00:00-05:00"

注意,当你使用默认的 moment 构造函数解析时,它会从指定的偏移量转换为用户的本地时间。

如果要保持固定偏移,请使用 parseZone:

moment.parseZone('Mon Jun 13 2016 08:00:00 GMT+1000', 'ddd MMM DD YYYY HH:mm:ss [GMT]ZZ').format()
"2016-06-13T08:00:00+10:00"

编辑:注意评论。如果是日期,直接传入即可。我应该注意到了。

【讨论】:

    【解决方案2】:

    doc中所述:-

    从字符串创建时刻时,我们首先检查字符串是否与已知的 ISO 8601 格式匹配,如果未找到已知格式,则回退到 new Date(string)。

    所以我建议你使用moment(new Date(booking.booking_date_time)),它会起作用。 (如果 booking.booking_date_time 是一个有效的日期对象

    另请参阅moment-format 以更改为moment.js 支持的不同格式

    【讨论】:

    • 通过 Date 对象解析日期是不可靠的,建议的方法是也传递格式 'ddd MMM DD YYYY HH:mm:ss [GMT]ZZ',正如 Maggie 在下面建议的那样.有关Date 解析不一致here 的更多信息。
    • @AngelaNicholas 为什么通过 Date 对象解析日期不可靠?
    • 解释在上面的超链接中(github.com/moment/moment/issues/1407#issuecomment-155630060);这是相关的引用——“通过 Date 对象解析日期是不可靠的,并且跨平台不一致。有不同的实现和不同的行为。有时你可能会得到本地时间。有时你可能会得到 UTC。有时你可能会得到 Invalid Date。有时你将在 DST 转换附近得到不同的结果。不要试图消除错误。相反,请遵循我们的指南。使用已知格式或提供格式字符串。"
    猜你喜欢
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    相关资源
    最近更新 更多