如何修改JavaScript中Date对象的时区 解决转换后仍显示本地时区问题
核心原因
原生JavaScript的Date对象本身不存储任何时区信息,它内部仅保存对应的UNIX时间戳(即1970年1月1日UTC时间零点到该时间的毫秒数)。所有直接打印Date实例的操作,默认都会用代码运行环境的本地时区对时间戳做格式化输出,这就是你拿到的Date对象始终显示巴基斯坦本地时区的根本原因。
你最后一段代码的逻辑从根上就行不通:你把带PST时区的格式化字符串传给Date构造函数时,JS会先把这个PST时间转换成对应的UTC时间戳存储,等你打印这个Date实例时,又会用本地时区把时间戳转成本地时间显示,自然就变回了你本地的时间。
解决方案
1. 仅需展示目标时区时间
直接使用toLocaleString系列方法指定时区参数,拿到格式化后的字符串直接用于展示即可,不需要再转回Date对象:
// 直接拿到洛杉矶时区的格式化时间字符串,直接用来展示就行 const laTimeStr = new Date().toLocaleString("en-US", { timeZone: "America/Los_Angeles", timeZoneName: "short" }) // 输出:'11/18/2021, 3:30:54 AM PST'
2. 需要对目标时区时间做计算/操作
如果要对目标时区的时间做加减、判断等逻辑处理,推荐使用支持时区的日期处理库:
- 可以选择
luxon、date-fns-tz、moment-timezone这类成熟库,它们封装的日期对象可以保留时区信息,所有操作都会基于指定时区执行,不会被本地时区干扰。
以luxon为例,用法如下:
import { DateTime } from 'luxon' // 生成洛杉矶时区的当前时间对象 const laDate = DateTime.now().setZone('America/Los_Angeles') // 可以直接做计算、格式化,都基于洛杉矶时区 console.log(laDate.toFormat('yyyy-MM-dd HH:mm:ss zzz'))
你提供的测试运行截图如下:
内容的提问来源于stack exchange,提问作者Muhammad Iftikhar Rasool
相关产品推荐
相关产品推荐

