Javascript 使用moment.js将Utc日期更改为本地日期

Javascript 使用moment.js将Utc日期更改为本地日期,javascript,date,datetime,timezone,momentjs,Javascript,Date,Datetime,Timezone,Momentjs,我在一个webapp中使用带有时区的moment.js进行日期操作。我将所有日期存储在UTC中,并将其作为UTC返回到UI。我有用户的时区。我想将UTC时间转换为本地用户时区 var timezone = "America/New_York"; var utcDate = "2013-10-16T10:31:59.0537721Z"; var localDate = moment(utcDate).utc().tz(timezone).format() 当我尝试这样做的时候,我的时间错了。不

我在一个webapp中使用带有时区的moment.js进行日期操作。我将所有日期存储在UTC中,并将其作为UTC返回到UI。我有用户的时区。我想将UTC时间转换为本地用户时区

var timezone = "America/New_York";
var utcDate = "2013-10-16T10:31:59.0537721Z";

var localDate = moment(utcDate).utc().tz(timezone).format()
当我尝试这样做的时候,我的时间错了。不确定如何使这一时刻起作用,您可以尝试:

moment.utc(utcDate).tz(timezone).format()
但这不重要。他们都应该制作:
“2013-10-16T06:31:59-04:00”

它适用于我,运行在Chrome30上,所以它可能与浏览器相关


如果您在IE8上运行Moment.js 2.3.1或更早版本,那么这是问题的副作用,在2.4.0中已修复。更新到最新版本应该可以解决问题。

使用
+
操作符获取unix时间,然后:

moment(+moment.utc(utcDate))
工作原理:

  • 矩。utc(字符串)
    解析字符串并返回设置为utc时区的矩对象
  • +
    返回obejct时刻的unix偏移量(以毫秒为单位)
  • 时刻(数字)
    使用传入的unix偏移量在用户的本地时区中创建一个新的时刻对象

    • 对于有相同问题的人:

      日期iso格式应包含时区。以下是momentjs允许的格式:

      YYYY-MMM-DDTHH:mm:ss+00:00
      
      注意+00:00表示UTC

      范例

      moment('2014-10-03T09:31:18+00:00').format()
      
      会转变吗

      "2014-10-03T17:31:18+08:00"
      

      即使你不知道时区,你也会得到客户端偏移量,然后像这样使用

      let utcTime = "2017-02-02 08:00:13.567";
      var offset = moment().utcOffset();
      var localText = moment.utc(utcTime).utcOffset(offset).format("L LT");
      

      试试这个

      我对这个答案投了赞成票,因为不说明原因而投反对票是没有用的。