我正在尝试在我的节点服务器上将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
。
我该怎么做?
注意:请记住,在我的情况下,在将时区传回客户端后,我没有选择转换时区。
答案 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。