从服务器我得到一个datetime变量的格式:6/29/2011 4:52:48 PM,它是UTC时间。我想使用JavaScript将其转换为当前用户的浏览器时区。
如何使用JavaScript或jQuery来做到这一点?
从服务器我得到一个datetime变量的格式:6/29/2011 4:52:48 PM,它是UTC时间。我想使用JavaScript将其转换为当前用户的浏览器时区。
如何使用JavaScript或jQuery来做到这一点?
当前回答
我创建了一个函数,将所有时区转换为本地时间。
我没有使用getTimezoneOffset(),因为它没有返回适当的偏移值
要求:
1. npm i moment-timezone
function utcToLocal(utcdateTime, tz) {
var zone = moment.tz(tz).format("Z") // Actual zone value e:g +5:30
var zoneValue = zone.replace(/[^0-9: ]/g, "") // Zone value without + - chars
var operator = zone && zone.split("") && zone.split("")[0] === "-" ? "-" : "+" // operator for addition subtraction
var localDateTime
var hours = zoneValue.split(":")[0]
var minutes = zoneValue.split(":")[1]
if (operator === "-") {
localDateTime = moment(utcdateTime).subtract(hours, "hours").subtract(minutes, "minutes").format("YYYY-MM-DD HH:mm:ss")
} else if (operator) {
localDateTime = moment(utcdateTime).add(hours, "hours").add(minutes, "minutes").format("YYYY-MM-DD HH:mm:ss")
} else {
localDateTime = "Invalid Timezone Operator"
}
return localDateTime
}
utcToLocal("2019-11-14 07:15:37", "Asia/Kolkata")
//Returns "2019-11-14 12:45:37"
其他回答
function getUTC(str) {
var arr = str.split(/[- :]/);
var utc = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);
utc.setTime(utc.getTime() - utc.getTimezoneOffset()*60*1000)
return utc;
}
对于其他访问的人-使用此函数从UTC字符串中获取本地日期对象,应该关心DST,并将在IE, IPhone等上工作。
我们分割字符串(因为JS日期解析在某些浏览器上不支持) 我们得到UTC的差值,然后用UTC时间减去它,得到当地时间。由于返回的偏移量是用DST计算的(如果我错了请纠正我),所以它将在变量“utc”中设置该时间。最后返回date对象。
这是我正在做的将UTC转换为本地时间:
常量数据日期 = '2020-09-15 07:08:08' const utcDate = new Date(dataDate); const myLocalDate = new Date(Date.UTC( utcDate.getFullYear() utcDate.getMonth(), utcDate.getDate(), utcDate.getHours(), utcDate.getMinutes() )); document.getElementById(“dataDate”).innerHTML = dataDate; document.getElementById(“myLocalDate”).innerHTML = myLocalDate; <p>世界标准时间<p> <p id=“dataDate”></p> <p>本地(格林威治标准时间 +7)<p> <p id=“myLocalDate”></p>
结果:2020年9月15日星期二14:08:00 GMT+0700(印度支那时间)
我创建了一个函数,将所有时区转换为本地时间。
我没有使用getTimezoneOffset(),因为它没有返回适当的偏移值
要求:
1. npm i moment-timezone
function utcToLocal(utcdateTime, tz) {
var zone = moment.tz(tz).format("Z") // Actual zone value e:g +5:30
var zoneValue = zone.replace(/[^0-9: ]/g, "") // Zone value without + - chars
var operator = zone && zone.split("") && zone.split("")[0] === "-" ? "-" : "+" // operator for addition subtraction
var localDateTime
var hours = zoneValue.split(":")[0]
var minutes = zoneValue.split(":")[1]
if (operator === "-") {
localDateTime = moment(utcdateTime).subtract(hours, "hours").subtract(minutes, "minutes").format("YYYY-MM-DD HH:mm:ss")
} else if (operator) {
localDateTime = moment(utcdateTime).add(hours, "hours").add(minutes, "minutes").format("YYYY-MM-DD HH:mm:ss")
} else {
localDateTime = "Invalid Timezone Operator"
}
return localDateTime
}
utcToLocal("2019-11-14 07:15:37", "Asia/Kolkata")
//Returns "2019-11-14 12:45:37"
这对我来说很管用
选项1:如果日期格式是"yyyy-mm-dd"或"yyyy-mm-dd H:n:s",例如:"2021-12-16 06:07:40"
使用这种格式,它不知道它是本地格式还是UTC时间。既然我们知道日期是UTC,我们必须确保JS知道它是UTC。所以我们必须将日期设置为UTC。
function setDateAsUTC(d) {
let date = new Date(d);
return new Date(
Date.UTC(
date.getFullYear(),
date.getMonth(),
date.getDate(),
date.getHours(),
date.getMinutes(),
date.getSeconds()
)
);
}
然后使用它
let d = "2021-12-16 06:07:40";
setDateAsUTC(d).toLocaleString();
// output: 12/16/2021, 6:07:40 AM
选项2:UTC日期格式为ISO-8601。大多数服务器的时间戳格式是ISO-8601 ex: '2011-06-29T16:52:48.000Z'。这样我们就可以把它传递给date函数和toLocaleString()函数。
let newDate = "2011-06-29T16:52:48.000Z"
new Date(newDate).toLocaleString();
//output: 6/29/2011, 4:52:48 PM
我在safari/chrome/firefox浏览器中使用这种方法效果很好:
const localDate = new Date(`${utcDate.replace(/-/g, '/')} UTC`);