美国各个时区转换成北京时间 utc gmt

4,823 阅读2分钟

工作中用到将美国的格格时区转换成北京时间,研究了一下总结了一下方式用来转换。 根据时间差得到下面的转换时间的差值,然后进行统一处理。

export function utcChangeBeijing(date) {

var time_zone = Number(localStorage.getItem('TimeZone')) === 0 ?  1 : Number(localStorage.getItem('TimeZone'))
if (date == '' || date == null) {
    return ''
} else {
    switch(time_zone) {
        case 1:
            // 处理北京时间
            return TimeFormat(date, 0)
            break;
        case 2:
            // 东部时间  有夏时令和冬时令  相差12个小时, 冬时令相差13个小时
            if (IsSumber(date, 1)) {
                return TimeFormat(date, 12)
            } else {
                return TimeFormat(date, 13)
            }
        case 3:
            // 中部时间  有夏时令和冬时令  相差13个小时, 冬时令相差14个小时
            if (IsSumber(date, 1)) {
                return TimeFormat(date, 13)
            } else {
                return TimeFormat(date, 14)
            }
        case 4:
            // 山地时间  有夏时令和冬时令 夏时令 相差14个小时, 冬时令相差15个小时
            if (IsSumber(date, 1)) {
                return TimeFormat(date, 14)
            } else {
                return TimeFormat(date, 15)
            }
        case 5:
            // 亚利桑那时间 相差15个小时
            return TimeFormat(date, 15)
        case 6:
            // 太平洋时间  有夏时令和冬时令 夏时令 相差15个小时, 冬时令相差16个小时
            if (IsSumber(date, 1)) {
                return TimeFormat(date, 15)
            } else {
                return TimeFormat(date, 16)
            }
        case 7:
            // 阿拉斯加时间  有夏时令和冬时令  夏时令 相差17个小时, 冬时令相差18个小时
            if (IsSumber(date, 1)) {
                return TimeFormat(date, 17)
            } else {
                return TimeFormat(date, 18)
            }
        case 8:
            // 夏威夷时间 没有夏时令和冬时令 相差18个小时
            return TimeFormat(date, 18)
    }
}

}

#格式化时间转换成YYYY-MM-DD hh-mm-ss,可能方式有点笨拙。就这么解决了。

function TimeFormat(date, timeNumber) {

date = new Date(date)
var time = date.getTime() + timeNumber * 3600 * 1000
var dateNow = new Date(time);
var Y = dateNow.getFullYear() + '-';
var M = (dateNow.getMonth() + 1 < 10 ? '0' + (dateNow.getMonth() + 1) : dateNow.getMonth() + 1) + '-';
var D = (dateNow.getDate() <10 ) ? '0' + dateNow.getDate() + ' ' : dateNow.getDate() + ' ';
var h = (dateNow.getHours() < 10) ? '0' + dateNow.getHours() + ':' : dateNow.getHours() + ':';
var m = (dateNow.getMinutes() < 10) ? '0' + dateNow.getMinutes() + ':' : dateNow.getMinutes() + ':';
var s = (dateNow.getSeconds() < 10) ? '0' + dateNow.getSeconds() : dateNow.getSeconds();
return Y + M + D + h + m + s;

}

#判断是东部时区还是西部时区,默认按照东部时区处理了。后台用的php竟然能全部兑上。好神奇

function IsSumber(date, isEast) {

date = new Date(date)
var start = new Date(date.getTime());
start.setMonth(0);
start.setDate(1);
start.setHours(0);
start.setMinutes(0);
start.setSeconds(0);

var middle = new Date(start.getTime());
middle.setMonth(6);
// 如果年始和年中时差相同,则认为此国家没有夏令时
if ((middle.getTimezoneOffset() - start.getTimezoneOffset()) == 0) {
    return false;
}
var margin = 0;
if (isEast == 1) {
    margin = middle.getTimezoneOffset();
} else {
    margin = start.getTimezoneOffset();
}

if (date.getTimezoneOffset() == margin) {
    return true;
}
return false;

}

在这里额外提醒,如果本地电脑设置的语言不同的话,尽量增加new Date()返回的后面时区的语言。上面这套仅对中国用户有用。