javascript - 使用 moment().utcOffset() 更新时间偏移

标签 javascript express time momentjs utc

我在尝试使用 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
  • 用户日期:20151001 012421 +0000

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

  • utcDate: 20151001 012421 +0000
  • 用户日期:20151001 052421 +0400

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

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

最佳答案

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

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 对象处于“本地模式”,因此除非机器的时区实际设置为 UTC,否则您的 utcDate 输出将是错误的。

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

关于javascript - 使用 moment().utcOffset() 更新时间偏移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32878197/

相关文章:

javascript - 井字棋 javascript 答案检查器

javascript - 如何将选项卡缩略图保存到本地存储?

javascript - 针对字符串测试子字符串数组

c++ - 在 C++ 中获取当前年份的更优雅的方式

time - 算法时间复杂度分析

javascript - 如果其他元素中存在关键字,则禁用或隐藏选择选项

javascript - UIWebView/Javascript 桥接器的更快替代方案?

node.js - Mongoose/BodyParser 未正确接受 urlencoded POST 请求

javascript - 带有 express Node js 服务器的 XMLhttpRequest

javascript - 为什么我无法增加计时器值?