将日期从具有偏移的字符串转换为不同的时区

时间:2016-01-29 15:42:59

标签: javascript date momentjs

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

我目前有3个值:

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

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

我正在尝试将格式转换为时刻timezone的时刻接受的格式.tz()函数('2016-11-23T23:13-07:00')但是我不知道如何在不拆分的情况下执行此操作日期数组并将其转换为所述日期。

Moment的时区有我需要的工具,可以将日期转换为当地时区。例如:

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

关于如何将23/11/2016 23:13与偏离-07:00转换为本地日期的任何想法最好使用momentJS?

2 个答案:

答案 0 :(得分:2)

为什么不将格式化为带有偏移量的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

大多数现代浏览器也会解析它,但不要这样做,因为仍然有很多旧的浏览器会在哪里失败。

答案 1 :(得分:1)

我喜欢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');

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

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