时间戳指的是从某个固定时间点开始以秒计算的时间值,常用于时间计算、比较等场景。在编程开发中,时间戳计算是非常基础的技能之一,下面将从多个方面对时间戳计算做详细的阐述。
一、UTC时间和本地时间
UTC (Coordinated Universal Time) 是一个国际标准,用于表示时间的标准。UTC 时间与格林威治标准时间 (GMT) 基本相同,一般认为二者是等同的。在编程开发中,我们常常需要进行 UTC 时间和本地时间的转换,下面是代码示例。
function getLocalTime(utcTime) {
var d = new Date(utcTime);
var localTime = d.getTime() + (d.getTimezoneOffset() * 60 * 1000);
return new Date(localTime);
}
上述代码实现的是将 UTC 时间转换为本地时间的功能,将 UTC 时间通过 new Date() 方法生成 Date 对象,再通过 getTimezoneOffset() 获取本地时间与 UTC 时间的时差,最后再将时差与 UTC 时间的毫秒数相加即可得到本地时间。
二、时间戳和日期字符串的转换
在实际应用中,常常需要将时间戳转换为日期字符串或将日期字符串转换为时间戳。下面是代码示例。
function timestampToDateString(timestamp) {
var date = new Date(timestamp * 1000);
var year = date.getFullYear();
var month = addZero(date.getMonth() + 1);
var day = addZero(date.getDate());
var hour = addZero(date.getHours());
var minute = addZero(date.getMinutes());
var second = addZero(date.getSeconds());
return year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second;
}
function dateStringToTimestamp(dateString) {
var timestamp = Date.parse(new Date(dateString));
return timestamp / 1000;
}
function addZero(num) {
return num < 10 ? "0" + num : num;
}
timestampToDateString() 函数实现的是将时间戳转换为日期字符串的功能,首先将时间戳乘以 1000 转换为毫秒数,然后通过 new Date() 方法生成 Date 对象,再通过各种函数获取年、月、日、小时、分钟、秒数并以特定的格式拼接成日期字符串。dateStringToTimestamp() 函数实现的是将日期字符串转换为时间戳的功能,使用了 Date.parse() 方法将日期字符串解析为毫秒数,然后除以 1000 得到时间戳。
三、倒计时的实现
倒计时是常用的时间戳计算应用场景之一,在页面中常常会出现倒计时的效果。下面是代码示例。
var timer;
function countdown(endTime, callback) {
var now = Math.floor(Date.now() / 1000);
var remaining = endTime - now;
if (remaining < 0) {
callback();
clearInterval(timer);
} else {
var day = Math.floor(remaining / (60 * 60 * 24));
var hour = Math.floor(remaining / (60 * 60) % 24);
var minute = Math.floor(remaining / 60 % 60);
var second = Math.floor(remaining % 60);
var timeStr = addZero(day) + "天" + addZero(hour) + "小时" + addZero(minute) + "分" + addZero(second) + "秒";
callback(timeStr);
}
}
function startCountdown(endTime, callback) {
countdown(endTime, function(timeStr) {
callback(timeStr);
timer = setInterval(function() {
countdown(endTime, callback);
}, 1000);
});
}
function addZero(num) {
return num < 10 ? "0" + num : num;
}
上述代码实现的是倒计时的功能,startCountdown() 函数接收一个结束时间和回调函数,调用 countdown() 函数进行倒计时,并在回调函数中更新 UI。如果倒计时结束,则清除定时器并调用回调函数。countdown() 函数用于计算剩余时间,通过各种函数获取剩余时间的天、小时、分钟、秒数,并以特定的格式拼接成字符串,并在回调函数中返回。addZero() 函数用于对数字进行补零操作。
四、时区计算
在跨时区的场景中,需要进行时区计算。下面是代码示例。
function getTimezoneOffset(timezone) {
var date = new Date();
var localOffset = date.getTimezoneOffset() * 60;
var targetOffset = timezone * -60;
return targetOffset - localOffset;
}
function getLocalTimeInTimezone(timezone) {
var offset = getTimezoneOffset(timezone);
var localTime = Date.now() + offset * 1000;
return new Date(localTime);
}
上述代码实现的是获取指定时区下的本地时间的功能。getTimezoneOffset() 函数用于获取本地时间与指定时区的时差,targetOffset – localOffset 得到的是秒数,需要乘以 1000 转换为毫秒数。getLocalTimeInTimezone() 函数用于获取指定时区下的本地时间,通过 getTimezoneOffset() 函数获取对应时差,然后将当前时间加上时差得到本地时间。需要注意的是,Date.now() 返回的是 UTC 时间而不是本地时间。
