我想在JS中生成一个Date对象(或XDate),从UTC unix时间戳开始,添加一个时区偏移量,然后生成格式为" yyyy-MM-dd HH:mm:ss&的字符串#34 ;. 现在我这样做了:
createServerRelativeTs : function(unixtimeutc, utcoffset) {
var stimeUTCoffset = (isNaN(utcoffset)) ? 1 : utcoffset;
var time = new XDate(Math.round(unixtimeutc * 1000));
var hours = time.getUTCHours() + stimeUTCoffset;
time.setUTCHours(hours);
return time.toString("yyyy-MM-dd HH:mm:ss");
}
其中utcoffset是整数,unixtimeutc是unixtimestamp 此代码的问题在于,如果我在操作系统中更改时区,结果会发生变化!如果我将偏移值添加到时间戳,它将被忽略。如何获得与OS时区无关的结果?
答案 0 :(得分:0)
这实际上是几个答案的组合。您需要使用UTC工作以避免使用非UTC方法时考虑的主机时区的影响。
所以从UNIX时间值创建一个Date,调整偏移的UTC分钟,然后使用UTC方法将输出字符串格式化为本地。
使用库可能会有点简单,但实际上并不是必需的。
/* Given a Date, return a string in //yyyy-MM-dd HH:mm:ss format
** @param {Date} d
** @returns {string}
*/
function formatISOLocal(d) {
function z(n){return (n<10?'0':'')+n}
if (isNaN(d)) return d.toString();
return d.getUTCFullYear() + '-' +
z(d.getUTCMonth() + 1) + '-' +
z(d.getUTCDate()) + ' ' +
z(d.getUTCHours()) + ':' +
z(d.getUTCMinutes()) + ':' +
z(d.getUTCSeconds()) ;
}
/* Adjust time value for provided timezone
** @param {Date} d - date object
** @param {string} tz - UTC offset as +/-HH:MM or +/-HHMM
** @returns {Date}
*/
function adjustForTimezone(d, tz) {
var sign = /^-/.test(tz)? -1 : 1;
var b = tz.match(/\d\d/g); // should do some validation here
var offset = (b[0]*60 + +b[1]) * sign;
d.setUTCMinutes(d.getUTCMinutes() + offset);
return d;
}
// Given a UNIX time value for 1 Jan 2017 00:00:00,
// Return a string for the equivalent time in
// UTC+10:00
// 2017-01-01T00:00:00Z seconds
var n = 1483228800;
// Create Date object (a single number value is treated as a UTC time value)
var d = new Date(n * 1000);
// Adjust to UTC+10:00
adjustForTimezone(d, '+10:00');
// Format as local string
console.log(formatISOLocal(d))