时区转换,时间格式转换

本文介绍了JavaScript中关于时区和时间转换的基本概念,包括UT、TAI、GMT、UTC、LT的区别。详细讲解了如何计算时区差、本地时间转UTC时间的方法,并通过实例展示了时间戳和时间格式转换的过程,特别强调了getTimezoneOffset方法和toISOString方法的使用。此外,还讨论了如何将本地时间转换为特定时区(如阿拉伯地区)的时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本概念

  • UT - 世界时
  • TAI - 国际原子时
  • GMT - 格林尼治标准时间/格林威治平均时间
  • UTC - 协调世界时
  • LT - 本地时间

这篇文章解释的都很详细 一些时间的概念与区分(UTC、GMT、LT、TAI等)

我们一般认为GMT和UTC是一样的,都与英国伦敦的本地时相同。

UTC或GMT与LT如下的换算关系:LT = UTC + 时区差;
东区是加相应的时区差,西区是减时区差。如北京是东八区,则北京时间=UTC+8.

我们用 new Date() 获取的时间都是本地时间,也就是电脑的系统时间。

一个 Unix 时间戳(Unix Time Stamp),它是一个整数值,表示自1970年1月1日00:00:00 UTC(the Unix epoch)以来的毫秒数,忽略了闰秒。请注意大多数 Unix 时间戳功能仅精确到最接近的秒。

时区差计算

getTimezoneOffset 方法返回协调世界时(UTC)相对于当前时区的时间差值,单位为分钟。

时区偏差(time-zone offset)表示协调世界时(UTC)与本地时区之间的差值,单位为分钟。需要注意的是如果本地时区晚于协调世界时,则该差值为正值,如果早于协调世界时则为负值。例如你所在时区为 UTC+10(澳大利亚东部标准时间),将会返回 -600。对于同一个时区,夏令时(Daylight Saving Time)将会改变这个值。

new Date().getTimezoneOffset()		// -480 我所在的时区是东八区(UTC+8)

本地时间转UTC时间(时间戳)

toISOString() 方法返回一个 ISO(ISO 8601 Extended Format)格式的字符串: YYYY-MM-DDTHH:mm:ss.sssZ。时区总是UTC(协调世界时),加一个后缀“Z”标识。

new Date("2019-07-04 00:00:00")					// Thu Jul 04 2019 00:00:00 GMT+0800 (中国标准时间)
new Date("2019-07-04 00:00:00").toISOString()	// "2019-07-03T16:00:00.000Z"

从上面打印结果可以看到:

本地时间是 2019-07-04 00:00:00
UTC时间是 2019-07-03 16:00:00

例子

获取跟本地时间一样的UTC时间,比如:获取UTC时间 2019-07-04 00:00:00
  1. 获取时区差
    const localOffset = new Date().getTimezoneOffset() * 60 * 1000;
    
  2. 上面的公式还记得吗:LT = UTC + 时区差
    // 获取本地时间戳
    const localTimeStamp = new Date("2019-07-04 00:00:00").getTime();
    // UTC = LT - 时区差
    const utcTimeStamp = localTimeStamp - localOffset;
    console.log(new Date(utcTimeStamp).toISOString());	// "2019-07-04T00:00:00.000Z"
    
  3. 整理一下
    function toUTCTimeOrStamp(date, unix) {
    	// 获取时区差
    	const localOffset = new Date().getTimezoneOffset() * 60 * 1000;
    	// 获取本地时间戳
    	const localTimeStamp = new Date(date).getTime();
    	// 计算UTC时间戳
    	const utcTimeStamp = localTimeStamp - localOffset;
    	// 计算UTC时间
    	const utcTime = new Date(utcTimeStamp).toISOString();
    	
    	return unix ? utcTimeStamp : utcTime;
    }
    toUTCTimeOrStamp("2019-07-04 00:00:00", true);		// 1562198400000
    toUTCTimeOrStamp("2019-07-04 00:00:00");			// "2019-07-04T00:00:00.000Z"
    
需求:
  • 本地选择一个时间,将这个时间转换成阿拉伯的时间存储。
  • 取出这个时间展示为在阿拉伯本地显示的时间。 阿拉伯(东三区 +3)
  1. 本地时间 -> UTC时间:UTC = LT - localOffset(getTimezoneOffset() -> -8)

  2. 阿拉伯本地时间:

     ZoneLT = UTC + zoneOffset(getTimezoneOffset() -> -3) 
     		= LT - localOffset(getTimezoneOffset() -> -8) + zoneOffset(getTimezoneOffset() -> -3)
     		= LT - (localOffset + zone(+3))
    
    // 计算时区
    function GetOffsetTime(zone) {
    	// 本地时区偏差 注意 getTimezoneOffset 返回值单位为分钟
    	const localOffset = new Date().getTimezoneOffset();
    	// 给定时区偏差
        return (localOffset + zone * 60) * 60;
    }
    
    // 计算阿拉伯本地时间戳
    function ToZoneTimeStamp(timeStamp, zone) {
        return (timeStamp / 1000 - GetOffsetTime(zone));
    }
    // 存储阿拉伯本地时间戳
    const selectDate = new Date('2019-07-04 00:00:00')
    const timeStamp = ToZoneTimeStamp(selectDate, 3);
    console.log(timeStamp);		// 1562187600
    
    // 将阿拉伯本地时间显示出来:1562187600
    function ToZoneTime(timeStamp, zone) {
    	// 
    	const zoneTimeStamp = (timeStamp + zone * 60 * 60) * 1000;
    	// utcDateFormat 函数在下面
    	const zoneTime = utcDateFormat(new Date(zoneTimeStamp));
    	return zoneTime;
    }
    const zoneDate = ToZoneTime(1562187600, 3);
    console.log(zoneDate);		// "2019-07-04 00:00:00",不管本地时间是多少,都会显示这个阿拉伯时间
    

时间格式转换

// 小于10补0
function padZero(num) {
	return num > 9 ? num : `0${num}`;
}
// 本地时间格式
function localDateFormat(date) {
	const YYYY = date.getFullYear();
	const MM = padZero(date.getMonth() + 1);
	const DD = padZero(date.getDate());
	const hh = padZero(date.getHours());
	const mm  = padZero(date.getMinutes());
	const ss = padZero(date.getSeconds());
	return `${YYYY}-${MM}-${DD} ${hh}:${mm}:${ss}`;
}
// UTC时间格式
function utcDateFormat(date) {
	const YYYY = date.getUTCFullYear();
	const MM = padZero(date.getUTCMonth() + 1);
	const DD = padZero(date.getUTCDate());
	const hh = padZero(date.getUTCHours());
	const mm  = padZero(date.getUTCMinutes());
	const ss = padZero(date.getUTCSeconds());
	return `${YYYY}-${MM}-${DD} ${hh}:${mm}:${ss}`;
}
localDateFormat(new Date());
utcDateFormat(new Date());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值