时间戳(Timestamp)是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。它是一种时间表示方式,与时区无关,全球统一。
时间戳通常有两种表示方式:
GMT(格林威治标准时间):是指位于英国伦敦郊区的皇家格林威治天文台的标准时间,因为本初子午线被定义在通过那里的经线。
UTC(协调世界时):是最主要的世界时间标准,它基于国际原子时,并通过不规则的闰秒来抵消地球自转变慢的影响。
在实际应用中,GMT和UTC的时间几乎相同,但UTC更加精确,是现代计算机系统普遍采用的时间标准。
闰秒是为了协调原子时间和地球自转时间而设立的调整机制。由于地球自转速度在逐渐减慢,为了使UTC时间与地球自转周期保持同步,国际计量组织会不定期地在UTC中插入"闰秒"。
当加入闰秒时,一分钟可能会有61秒,例如:23:59:59 → 23:59:60 → 00:00:00。这对计算机系统可能造成一些问题,因为大多数系统假设一分钟恰好是60秒。
千年虫问题是指在20世纪末期,许多计算机系统使用两位数字来表示年份(如"99"表示1999年)。当日期从1999年12月31日变为2000年1月1日时,这些系统可能会将"00"误解为1900年而非2000年,导致日期计算错误。
这个问题源于早期计算机存储空间有限,程序员为了节省空间而只用两位数字表示年份。为解决这个问题,全球花费了大量资源对系统进行修复,使其能够正确处理跨世纪的日期。
时间戳有以下优势:
类似于千年虫问题,2038年问题是指使用32位有符号整数表示的Unix时间戳将在2038年1月19日03:14:07 UTC达到最大值(2^31-1)。超过这个时间点后,时间戳会溢出变为负数,系统可能会将日期误解为1901年。
现代系统大多已采用64位时间戳来解决这个问题,64位时间戳可以表示到约2920亿年后的日期,远超地球和太阳的预期寿命。
// 获取毫秒级时间戳 const timestampMs = Date.now(); // 或 const timestampMs = new Date().getTime(); // 获取秒级时间戳 const timestampS = Math.floor(Date.now() / 1000);
// 获取毫秒级时间戳 $timestampMs = round(microtime(true) * 1000); // 获取秒级时间戳 $timestampS = time();
import time import datetime # 获取毫秒级时间戳 timestamp_ms = int(time.time() * 1000) # 或 timestamp_ms = int(datetime.datetime.now().timestamp() * 1000) # 获取秒级时间戳 timestamp_s = int(time.time()) # 或 timestamp_s = int(datetime.datetime.now().timestamp())
// 获取毫秒级时间戳 long timestampMs = System.currentTimeMillis(); // 获取秒级时间戳 long timestampS = System.currentTimeMillis() / 1000;
// 获取毫秒级时间戳
long timestampMs = DateTimeOffset.Now.ToUnixTimeMilliseconds();
// 获取秒级时间戳
long timestampS = DateTimeOffset.Now.ToUnixTimeSeconds();
import (
"time"
)
// 获取毫秒级时间戳
timestampMs := time.Now().UnixNano() / int64(time.Millisecond)
// 获取秒级时间戳
timestampS := time.Now().Unix()
# 获取毫秒级时间戳
timestamp_ms = (Time.now.to_f * 1000).to_i
# 获取秒级时间戳
timestamp_s = Time.now.to_i
// 获取毫秒级时间戳
let timestampMs = Int(Date().timeIntervalSince1970 * 1000)
// 获取秒级时间戳
let timestampS = Int(Date().timeIntervalSince1970)
-- 获取毫秒级时间戳(MySQL 5.6+)
SELECT UNIX_TIMESTAMP(NOW(3)) * 1000;
-- 获取秒级时间戳
SELECT UNIX_TIMESTAMP();
SELECT UNIX_TIMESTAMP(NOW());
-- 获取毫秒级时间戳
SELECT EXTRACT(EPOCH FROM NOW()) * 1000;
-- 获取秒级时间戳
SELECT EXTRACT(EPOCH FROM NOW())::INTEGER;
-- 获取毫秒级时间戳(SQL Server 2016+)
SELECT DATEDIFF_BIG(MILLISECOND, '1970-01-01', GETUTCDATE());
-- 获取秒级时间戳
SELECT DATEDIFF(SECOND, '1970-01-01', GETUTCDATE());
#!/bin/bash
# 获取秒级时间戳
timestamp_s=$(date +%s)
# 获取毫秒级时间戳
timestamp_ms=$(($(date +%s%N)/1000000))
echo "秒级时间戳: $timestamp_s"
echo "毫秒级时间戳: $timestamp_ms"
#include#include #include int main() { // 获取秒级时间戳 time_t timestamp_s = time(NULL); // 获取毫秒级时间戳 struct timeval tv; gettimeofday(&tv, NULL); long long timestamp_ms = tv.tv_sec * 1000LL + tv.tv_usec / 1000; printf("秒级时间戳: %ld\n", timestamp_s); printf("毫秒级时间戳: %lld\n", timestamp_ms); return 0; }
<%
' 获取秒级时间戳
Function GetUnixTimestamp()
GetUnixTimestamp = DateDiff("s", "01/01/1970 00:00:00", Now())
End Function
' 获取毫秒级时间戳
Function GetUnixTimestampMs()
Dim currentDate
currentDate = Now()
GetUnixTimestampMs = DateDiff("s", "01/01/1970 00:00:00", currentDate) * 1000
End Function
' 使用示例
Dim timestampS, timestampMs
timestampS = GetUnixTimestamp()
timestampMs = GetUnixTimestampMs()
Response.Write "秒级时间戳: " & timestampS & "
"
Response.Write "毫秒级时间戳: " & timestampMs & "
"
%>
#include
#include
int main() {
// 获取毫秒级时间戳 (C++11)
auto now = std::chrono::system_clock::now();
auto timestamp_ms = std::chrono::duration_cast(
now.time_since_epoch()
).count();
// 获取秒级时间戳
auto timestamp_s = std::chrono::duration_cast(
now.time_since_epoch()
).count();
std::cout << "秒级时间戳: " << timestamp_s << std::endl;
std::cout << "毫秒级时间戳: " << timestamp_ms << std::endl;
return 0;
}
date +%s
# 在 Linux 中,date +%s 命令用于显示当前时间的 Unix 时间戳(Unix Timestamp)
# 即从 1970 年 1 月 1 日 00:00:00 UTC(协调世界时) 到当前时间的总秒数(不包括闰秒)。
# date +%s 获取当前 Unix 时间戳(秒)
# date -d @时间戳 将时间戳转为可读时间
# date -d "YYYY-MM-DD HH:MM:SS" +%s 将指定时间转为时间戳