Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

时间戳和时区问题 #8

Open
yinxin630 opened this issue Apr 24, 2019 · 0 comments
Open

时间戳和时区问题 #8

yinxin630 opened this issue Apr 24, 2019 · 0 comments

Comments

@yinxin630
Copy link
Owner

什么是时间戳

时间戳 指的就是Unix时间戳(Unix timestamp)。它也被称为Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数

时间戳 在地球的每一个角落都是相同的, 可以尝试修改不同时区查看下面代码结果

console.log(Date.now());

结果都是一样的

什么是时区

时区 是指相同的时间在不同的地区有不同的含义, 我们所处的时区为 东八区, 可以在设备的时间设置中手动调整时区

同一时间戳在不同时区所表示的日期是不同的, 比如下面的代码

const time = new Date(1556074515196);
console.log(time.getFullYear());
console.log(time.getMonth());
console.log(time.getDate());

在北京时间执行的结果为 2019 3 24, 而在美国时间执行的结果却是 2019 3 23

产生的问题

有这样一个场景, 接口返回了某演出的开演时间string和相应的时间戳, string是按服务端按东八区计算的结果, 然后端上会用时间戳展示一个日历组件, 结果导致用户选择了15号的日期, 实际演出却是16号的, 造成客诉

如何解决问题

定义了如下方法用于转换时区, 使其得到的结果与服务端一致

/**
* 把指定时区的时间换算到当地时区
* @param {number} timestamp 指定的时间戳
* @param {number} timeZone 指定时间戳的时区,
* @returns {number} 系统时区的时间
*/
function transformToLocalTime(timestamp, timeZone = -8) {
    const date = new Date();
    const zone = date.getTimezoneOffset() / 60;
    const zoneGap = zone - timeZone;
    timestamp += (zoneGap * 60 * 60 * 1000);
    return timestamp;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant