🟨
TimeCraft

JavaScript Timestamp

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日。