将Localized Iso date格式化为hh:mm:ss

时间:2017-05-08 22:43:21

标签: javascript node.js date

我正在尝试在我的节点服务器上将UTC日期转换为本地时间,最后以hh:mm:ss格式返回本地化时间(不使用Moment JS)。我将时区偏移从客户端传递到Node,即GMT-6。

我原来的时间是:2017-05-05T00:25:11.378Z

// ISOTimeString = `2017-05-05T00:25:11.378Z`
// offsetInMinutes = 360; (GMT - 6)
function isoDateToLocalDate(ISOTimeString, offsetInMinutes) {
  var newTime = new Date(ISOTimeString);
  return new Date(newTime.getTime() - (offsetInMinutes * 60000));
}

本地化时间为2017-05-04T18:25:11.378Z,这是正确的(2017-05-05T00:25:11 - 6 hours = 2017-05-04T18:25:11)。

// localIsoDate: 2017-05-04T18:25:11.378Z Date object
function formatTime(localIsoDate) {
  var hh = localIsoDate.getHours();
  var mm = localIsoDate.getMinutes();
  var ss = localIsoDate.getSeconds();
  return [hh, mm, ss].join(':');
}

// formatted: 12:25:11

问题是,当我仍然在服务器上时,当我尝试格式化为hh:mm:ss时,它会减去另外6个小时,给我12:25:11。我不想再次转换,我只是想从已经本地化的时间格式化并显示18:25:11

我该怎么做?

注意:请记住,在我的情况下,在将时区传回客户端后,我没有选择转换时区。

1 个答案:

答案 0 :(得分:2)

isoDateToLocalDate 似乎没问题,但是在 formatTime 中您需要使用UTC方法,否则您将获得主机本地值,而不是调整后的UTC值。

此外,在ISO 8601术语(以及计算机编程之外的一般惯例)中,360的偏移表示+0600的时区,而不是-0600。见下面的注释。

// ISOTimeString = 2017-05-05T00:25:11.378Z
// ECMAScript offsetInMinutes = 360; (GMT-0600)
function isoDateToLocalDate(ISOTimeString, offsetInMinutes) {
  var newTime = new Date(ISOTimeString);
  return new Date(newTime.getTime() - (offsetInMinutes * 60000));
}

// localIsoDate: 2017-05-04T18:25:11.378Z Date object
function formatTime(localIsoDate) {
  function z(n){return (n<10?'0':'')+n}
  var hh = localIsoDate.getUTCHours();
  var mm = localIsoDate.getUTCMinutes();
  var ss = localIsoDate.getUTCSeconds();
  return z(hh)+':'+z(mm)+':'+z(ss);
}

var timeString = '2017-05-05T00:25:11.378Z';
var offset = 360;

console.log(formatTime(isoDateToLocalDate(timeString, offset)))

ECMAScript时区标志与通常的惯例相反。如果客户端时区偏移量为+0600,则其主机将显示-360。