【问题标题】:Updating time offset with moment().utcOffset()使用 moment().utcOffset() 更新时间偏移
【发布时间】:2015-12-28 22:53:33
【问题描述】:

我在尝试使用 moment.js 处理时间偏移时遇到了一些问题。

我在一个隐藏的输入中收集本地用户时间偏移:

<script type="text/javascript">
  $(document).ready(function () { 
    $('input#timeoffset').val(moment().utcOffset()); 
  });
</script>

偏移量得到正确存储(在我的例子中,它的值为-240)。稍后在服务器端(以 utc 时间运行)我尝试更新一些存储 utcDate 的数据库,执行如下操作:

var userDate = moment(utcDate).utcOffset(offset)

我的问题如下: 如果我按照上述方式运行我的代码,我不会得到任何效果:

  • utcDate: 20151001 012421 +0000
  • userDate: 20151001 012421 +0000

如果我翻转偏移符号,我会得到:

  • utcDate: 20151001 012421 +0000
  • userDate: 20151001 052421 +0400

我显然做错了什么(即使我的预期是第一个版本是正确的),你有什么提示吗?

在客户端我使用 moment.js v2.10.6 而在服务器端 moment-timezone.js v0.4.0 和 moment.js v2.10.6

【问题讨论】:

  • 在你应用偏移量之后,你如何处理userDate?您可能正在调用toDatevalueOfunix 或其他反映即时而不是墙上时间的方法。
  • 另外,请记住“时区!= 偏移量”。如果您存储用户的 当前 偏移量,然后将其应用于任意时间点,则很可能是该时间的错误偏移量。时区可以更改夏令时的偏移量,以及其他各种原因。
  • @MattJohnson 实际上我只是 .format(...) 打印出结果。我上面报告的结果打印在:console.log('utcDate: ' + moment(utcDate).format('YYYYMMDD HHmmss ZZ')); console.log('userDate: ' + moment(utcDate).utcOffset(offset).format('YYYYMMDD HHmmss ZZ'));utcDate 没有偏移量。

标签: javascript express time momentjs utc


【解决方案1】:

主要问题是您将偏移量作为字符串而不是数字传递。

moment.utc("2015-10-01 01:24:21").utcOffset("-240").format('YYYYMMDD HHmmss ZZ')
// "20151001 012421 +0000"

moment.utc("2015-10-01 01:24:21").utcOffset(-240).format('YYYYMMDD HHmmss ZZ')
// "20150930 212421 -0400"

如果您有以分钟为单位的偏移量,那么您必须使用数字形式。你可以随时转换它:

moment.utc("2015-10-01 01:24:21").utcOffset(+"-240").format('YYYYMMDD HHmmss ZZ')
// "20150930 212421 -0400"

Moment 允许将偏移量作为字符串传递,但它希望它们采用 ISO8601 格式之一:[+/-]HH:mm[+/-]HHmm

moment.utc("2015-10-01 01:24:21").utcOffset("-04:00").format('YYYYMMDD HHmmss ZZ')
// "20150930 212421 -0400"

另外,请注意我使用moment.utc(...) 来解析输入字符串。您刚刚使用了moment(...),它将使用local 时区,除非时区是明确的,或者如果您传递Date 对象而不是字符串。它还会使moment 对象处于“本地模式”,因此您的utcDate 输出将是错误的,除非机器的时区实际设置为UTC。

最后,不要忘记“时区!= 偏移量”。您不能假设您获得的偏移量对所有日期都有效。如果您需要将日期投影到用户的时区,您必须实际知道时区,例如America/New_York。您可以将它们与 moment-timezone 插件一起使用。

【讨论】:

  • 我刚刚发现这正是我的错误,我没有 parseInt 并且我对它在一个方向而不是另一个方向起作用而感到困惑,而 offset 是一个字符串!谢谢!
  • @Matt 你能帮我到这里吗stackoverflow.com/questions/66330037/…
猜你喜欢
  • 1970-01-01
  • 2017-05-09
  • 1970-01-01
  • 2019-10-24
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多