JavaScript时间戳转换完整教程
掌握JavaScript中Date对象处理Unix时间戳的所有技巧,包含获取、转换、格式化和时区处理的详细代码示例。
获取当前时间戳
使用Date对象获取当前Unix时间戳
JavaScript
// 获取当前时间戳(毫秒级)
const timestampMs = Date.now();
console.log(timestampMs); // 1735660800000
// 另一种方式
const timestampMs2 = new Date().getTime();
console.log(timestampMs2); // 1735660800000
// 获取当前时间戳(秒级)
const timestampSec = Math.floor(Date.now() / 1000);
console.log(timestampSec); // 1735660800
// 使用valueOf()
const timestampValue = new Date().valueOf();
console.log(timestampValue); // 1735660800000时间戳转日期
将Unix时间戳转换为Date对象或格式化字符串
JavaScript
// 时间戳转Date对象(毫秒)
const timestamp = 1735660800000;
const date = new Date(timestamp);
console.log(date.toString()); // Wed Jan 01 2025 00:00:00 GMT+0800
// 秒级时间戳需要乘以1000
const timestampSec = 1735660800;
const dateFromSec = new Date(timestampSec * 1000);
// 格式化输出
console.log(date.toISOString()); // 2024-12-31T16:00:00.000Z
console.log(date.toLocaleDateString()); // 2025/1/1
console.log(date.toLocaleString()); // 2025/1/1 00:00:00
console.log(date.toLocaleString('zh-CN', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
})); // 2025/01/01 00:00:00日期转时间戳
将日期字符串或Date对象转换为Unix时间戳
JavaScript
// 日期字符串转时间戳
const dateStr = '2025-01-01 00:00:00';
const date = new Date(dateStr);
const timestamp = date.getTime();
console.log(timestamp); // 1735660800000
// ISO格式字符串
const isoStr = '2025-01-01T00:00:00+08:00';
const timestamp2 = new Date(isoStr).getTime();
// 使用Date构造函数
const date2 = new Date(2025, 0, 1, 0, 0, 0); // 注意:月份从0开始
const timestamp3 = date2.getTime();
// 使用Date.UTC()获取UTC时间戳
const utcTimestamp = Date.UTC(2025, 0, 1, 0, 0, 0);
console.log(utcTimestamp); // 1735689600000日期格式化
将日期格式化为各种显示格式
JavaScript
const date = new Date(1735660800000);
// 内置方法
console.log(date.toISOString()); // 2024-12-31T16:00:00.000Z
console.log(date.toDateString()); // Wed Jan 01 2025
console.log(date.toTimeString()); // 00:00:00 GMT+0800 (中国标准时间)
console.log(date.toLocaleDateString('zh-CN')); // 2025/1/1
// 自定义格式化函数
function formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') {
const d = new Date(date);
const year = d.getFullYear();
const month = String(d.getMonth() + 1).padStart(2, '0');
const day = String(d.getDate()).padStart(2, '0');
const hour = String(d.getHours()).padStart(2, '0');
const minute = String(d.getMinutes()).padStart(2, '0');
const second = String(d.getSeconds()).padStart(2, '0');
return format
.replace('YYYY', year)
.replace('MM', month)
.replace('DD', day)
.replace('HH', hour)
.replace('mm', minute)
.replace('ss', second);
}
console.log(formatDate(date)); // 2025-01-01 00:00:00
console.log(formatDate(date, 'YYYY年MM月DD日')); // 2025年01月01日时区处理
处理不同时区的时间戳转换
JavaScript
const timestamp = 1735660800000;
const date = new Date(timestamp);
// 获取时区偏移(分钟)
const offset = date.getTimezoneOffset(); // -480 (东八区)
// 转换为指定时区时间
function toTimezone(date, offsetHours) {
const utc = date.getTime() + date.getTimezoneOffset() * 60000;
return new Date(utc + offsetHours * 3600000);
}
// 东八区(北京时间)
const beijing = toTimezone(date, 8);
console.log(beijing.toLocaleString());
// UTC时间
const utc = toTimezone(date, 0);
console.log(utc.toISOString());
// 使用Intl.DateTimeFormat格式化时区
const formatter = new Intl.DateTimeFormat('zh-CN', {
timeZone: 'Asia/Shanghai',
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
});
console.log(formatter.format(date)); // 2025/01/01 00:00:00常用时间操作
时间计算、比较等常用操作
JavaScript
// 时间差计算
const start = Date.now();
// ... 执行一些操作
const end = Date.now();
const elapsed = end - start; // 毫秒
console.log(`耗时: ${elapsed}ms`);
// 日期加减
const date = new Date(1735660800000);
date.setDate(date.getDate() + 7); // 加7天
date.setMonth(date.getMonth() + 1); // 加1个月
date.setHours(date.getHours() - 24); // 减24小时
// 比较日期
const date1 = new Date('2025-01-01');
const date2 = new Date('2025-01-02');
console.log(date1 < date2); // true
console.log(date1.getTime() === date2.getTime()); // false
// 获取今天的开始和结束时间戳
const today = new Date();
today.setHours(0, 0, 0, 0);
const startOfDay = today.getTime();
today.setHours(23, 59, 59, 999);
const endOfDay = today.getTime();最佳实践
- •JavaScript时间戳是毫秒级,Unix时间戳是秒级,注意转换
- •Date对象内部存储UTC时间戳,不受时区影响
- •使用Date.now()比new Date().getTime()更简洁高效
- •推荐使用ISO 8601格式(YYYY-MM-DDTHH:mm:ss.sssZ)进行时间传输
常见问题
JavaScript时间戳是秒还是毫秒?
JavaScript的Date对象使用毫秒级时间戳。Unix时间戳通常是秒级,所以转换时需要乘以或除以1000。使用Date.now()获取的是毫秒时间戳。
new Date()返回的时间是什么时区?
new Date()内部存储的是UTC时间戳,但toString()等方法会转换为本地时区显示。使用toISOString()可以获取UTC时间字符串,toLocaleString()获取本地时间。
如何避免时区问题?
推荐做法:1) 存储和传输使用UTC时间戳或ISO字符串;2) 显示时使用toLocaleString指定时区;3) 使用Intl.DateTimeFormat处理复杂时区需求。
Date对象的月份为什么从0开始?
JavaScript的Date对象月份范围是0-11(0代表一月),这是历史设计原因。创建日期时要特别注意:new Date(2025, 0, 1)表示2025年1月1日。