【问题标题】:Converting date from string with offset to different timezone将日期从带有偏移量的字符串转换为不同的时区
【发布时间】:2016-05-07 10:00:02
【问题描述】:

我想知道将非 ISO 格式的字符串日期转换为不同的偏移量/时区的正确方法。

我目前有 3 个值:

  • 格式为 MM/DD/YYYY (23/11/2016) 的日期
  • 24 小时制时间 (23:13)
  • 时区偏移 (-07:00)

我想将所述日期转换为用户的时区。

我正在尝试将格式转换为 moment timezone 的 moment.tz() 函数 ('2016-11-23T23:13-07:00') 接受的格式,但我不确定如何在不拆分的情况下做到这一点日期数组并将其转换为所述日期。

Moment 的时区有我需要的工具来将日期转换为本地时区。例如:

moment.tz('2016-11-23T23:13-07:00', moment.tz.guess());

关于如何将偏移量 -07:00 的 23/11/2016 23:13 转换为本地日期,最好使用 momentJS?

【问题讨论】:

    标签: javascript date momentjs


    【解决方案1】:

    为什么不直接格式化为带偏移量的 ISO 8601 字符串并将其提供给 moment.js?

    function customToISOString(date, time, offset){
      return date.split(/\D/).reverse().join('-') + 'T' + time + offset;
    }
    
    document.write(customToISOString('23/11/2016','23:13','-07:00')); // 2016-11-23T23:13-07:00

    大多数现代浏览器也会解析它,但不要这样做,因为仍有很多旧浏览器会出现故障。

    【讨论】:

      【解决方案2】:

      我喜欢 Rob 的回答,但我也会在 moment.js 中给你。

      首先,您不需要时刻时区,而且您绝对不需要猜测时区 id 就可以转换为该时区。在 ISO 格式中,它会是这样的:

      var m = moment('2016-11-23T23:13-07:00');
      

      这将在解析期间读入偏移量,应用它,然后转换为本地时区,以“本地模式”返回一个moment 对象。这是默认模式,所以它可以正常工作。

      根据您描述的要求,它将是这样的:

      // your inputs
      var d = "23/11/2016";
      var t = "23:13";
      var o = "-07:00";
      
      var m = moment(d + ' ' + t + o, 'MM/DD/YYYY HH:mmZ');
      

      请注意,为了安全起见,我在日期和时间之间添加了空格,因此不存在混淆年份和小时部分的风险。

      它会再次自动应用偏移量并转换为本地时区,因为这是默认行为。如果你想要一些其他行为,也有办法做到这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-23
        • 2021-08-21
        相关资源
        最近更新 更多