将 Date() 转换为 IsoString 显示不正确 hh:mm:ss
Converting Date() to IsoString doesn't show correct hh:mm:ss
我有一个像这样的日期变量 const date=new Date() 当我 console.log 这显示我 2017 年 5 月 2 日星期二 11:35:50 GMT+0300(GTB 夏令时)这是当然正确。我想将其转换为 Iso Date,我正在使用 javascript 的 toIsoString() 函数,如下所示:
const IsoDate = (date.toISOString()).slice(0, -5);
console.log(IsoDate)
但它在控制台中向我显示:
2017-05-02T08:35:50 好像显示的是实际日期前3小时。为什么会这样?
因为它给出的时间是 GMT [格林威治时区]。 toISOString 方法始终为 UTC。
要获取保持时区的 ISO 字符串,请使用此函数
function formatLocalDate() {
//pass date whatever u want
var now = new Date(),
tzo = -now.getTimezoneOffset(),
dif = tzo >= 0 ? '+' : '-',
pad = function(num) {
var norm = Math.abs(Math.floor(num));
return (norm < 10 ? '0' : '') + norm;
};
return now.getFullYear()
+ '-' + pad(now.getMonth()+1)
+ '-' + pad(now.getDate())
+ 'T' + pad(now.getHours())
+ ':' + pad(now.getMinutes())
+ ':' + pad(now.getSeconds())
+ dif + pad(tzo / 60)
+ ':' + pad(tzo % 60);
}
当然最好的选择是 Moment JS :)
引用 ISOString documentation:
...The timezone is always zero UTC offset...
时区始终设置为 UTC 0。这就是为什么我得到的值也与您相同,但我处于不同的时区。
如果你想使用 toISOString 但得到你所在时区的当前日期,你可以先通过偏移量调整 UTC 分钟,然后添加时区字符串,例如
function toISOStringLocal(date) {
// Copy date so don't modify original
var d = new Date(+date);
var offset = d.getTimezoneOffset();
var sign = offset < 0? '+' : '-';
// Subtract offset as ECMAScript offsets are opposite to usual
d.setUTCMinutes(d.getUTCMinutes() - d.getTimezoneOffset());
// Convert offset to string
offset = ('0' + (offset/60 | 0)).slice(-2) + ('0' + (offset%60)).slice(-2);
return d.toISOString().replace(/Z\s*/i,'') + sign + offset;
}
console.log('Current date: ' + toISOStringLocal(new Date()));
您还可以向 Date 原型添加方法:
// Return local date in ISO 8601 format
if (!Date.prototype.toISOStringLocal) {
Date.prototype.toISOStringLocal = function() {
var d = new Date(+this);
var offset = d.getTimezoneOffset();
var sign = offset < 0? '+' : '-';
d.setUTCMinutes(d.getUTCMinutes() - d.getTimezoneOffset());
offset = ('0' + (offset/60 | 0)).slice(-2) + ('0' + (offset%60)).slice(-2);
return d.toISOString().replace(/Z\s*/i,'') + sign + offset;
};
}
// Return UTC date in ISO 8601 format
if (!Date.prototype.toISODate) {
Date.prototype.toISODate = function() {
return d.toISOString().substr(0,10);
};
}
var d = new Date();
console.log('The current local date is: ' + d.toISOStringLocal() +
'\nThe current UTC date is : ' + d.toISODate()
);
我有一个像这样的日期变量 const date=new Date() 当我 console.log 这显示我 2017 年 5 月 2 日星期二 11:35:50 GMT+0300(GTB 夏令时)这是当然正确。我想将其转换为 Iso Date,我正在使用 javascript 的 toIsoString() 函数,如下所示:
const IsoDate = (date.toISOString()).slice(0, -5);
console.log(IsoDate)
但它在控制台中向我显示: 2017-05-02T08:35:50 好像显示的是实际日期前3小时。为什么会这样?
因为它给出的时间是 GMT [格林威治时区]。 toISOString 方法始终为 UTC。
要获取保持时区的 ISO 字符串,请使用此函数
function formatLocalDate() {
//pass date whatever u want
var now = new Date(),
tzo = -now.getTimezoneOffset(),
dif = tzo >= 0 ? '+' : '-',
pad = function(num) {
var norm = Math.abs(Math.floor(num));
return (norm < 10 ? '0' : '') + norm;
};
return now.getFullYear()
+ '-' + pad(now.getMonth()+1)
+ '-' + pad(now.getDate())
+ 'T' + pad(now.getHours())
+ ':' + pad(now.getMinutes())
+ ':' + pad(now.getSeconds())
+ dif + pad(tzo / 60)
+ ':' + pad(tzo % 60);
}
当然最好的选择是 Moment JS :)
引用 ISOString documentation:
...The timezone is always zero UTC offset...
时区始终设置为 UTC 0。这就是为什么我得到的值也与您相同,但我处于不同的时区。
如果你想使用 toISOString 但得到你所在时区的当前日期,你可以先通过偏移量调整 UTC 分钟,然后添加时区字符串,例如
function toISOStringLocal(date) {
// Copy date so don't modify original
var d = new Date(+date);
var offset = d.getTimezoneOffset();
var sign = offset < 0? '+' : '-';
// Subtract offset as ECMAScript offsets are opposite to usual
d.setUTCMinutes(d.getUTCMinutes() - d.getTimezoneOffset());
// Convert offset to string
offset = ('0' + (offset/60 | 0)).slice(-2) + ('0' + (offset%60)).slice(-2);
return d.toISOString().replace(/Z\s*/i,'') + sign + offset;
}
console.log('Current date: ' + toISOStringLocal(new Date()));
您还可以向 Date 原型添加方法:
// Return local date in ISO 8601 format
if (!Date.prototype.toISOStringLocal) {
Date.prototype.toISOStringLocal = function() {
var d = new Date(+this);
var offset = d.getTimezoneOffset();
var sign = offset < 0? '+' : '-';
d.setUTCMinutes(d.getUTCMinutes() - d.getTimezoneOffset());
offset = ('0' + (offset/60 | 0)).slice(-2) + ('0' + (offset%60)).slice(-2);
return d.toISOString().replace(/Z\s*/i,'') + sign + offset;
};
}
// Return UTC date in ISO 8601 format
if (!Date.prototype.toISODate) {
Date.prototype.toISODate = function() {
return d.toISOString().substr(0,10);
};
}
var d = new Date();
console.log('The current local date is: ' + d.toISOStringLocal() +
'\nThe current UTC date is : ' + d.toISODate()
);