刚接手的项目突然要加个“发布时间展示”,后台甩给你一个
1751260424000。你信心满满塞进new Date(),结果页面上赫然显示一串鬼都看不懂的英文日期——产品经理拍着桌子要你立刻改成“昨天 15:20”的格式。这种场景,每个前端都经历过。
一、JavaScript Date 的“爱恨情仇”
JavaScript 的 Date 对象就像个傲娇的伙伴:
const timestamp = 1751260424000; // 后台给的毫秒时间戳
const dateObj = new Date(timestamp);
console.log(dateObj);
// 输出: Mon Jun 30 2025 13:13:44 GMT+0800 (GMT+08:00)
// (实际显示取决于你的时区)
痛点来了:
- 月份从 0 开始计数(1月是0,12月是11)
- 获取年月日方法冗长(
getFullYear(),getMonth(),getDate()) - 时区处理极其容易翻车(尤其涉及跨国服务)--这个我们平常可能接触不到
二、基础转换:手写一个格式化函数
当你不需要复杂功能时,自己动手更灵活:
function formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0'); // 补零
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
return format
.replace('YYYY', year)
.replace('MM', month)
.replace('DD', day)
.replace('HH', hours)
.replace('mm', minutes)
.replace('ss', seconds);
}
// 使用示例
const now = new Date();
console.log(formatDate(now)); // 2025-06-30 11:05:30
console.log(formatDate(now, 'YYYY年MM月DD日')); // 2025年06月30日
三、时区陷阱:跨时区项目中的问题
假设你在北京时间(UTC+8)开发,但服务器数据来自纽约(UTC-5):
const nyTimestamp = 1751260424000; // 纽约时间 2025-06-30 13:13:44
// 错误!直接转换会按本地时区处理
const wrongDate = new Date(nyTimestamp);
console.log(wrongDate.toLocaleString()); // 输出北京时区时间:2025/06/30 13:13:44
// 正确姿势:明确时区信息
const correctDate = new Date(nyTimestamp).toLocaleString('zh-CN', {
timeZone: 'America/New_York',
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit'
});
console.log(correctDate); // 2025/06/30 13:13:44 (纽约时间)
四、终极神器:Day.js 优雅解决方案
当需求升级到“显示为1分钟前”、“下周二截止”时,就该请出轻量神器 Day.js(仅2KB):
<script src="https://cdn.jsdelivr.net/npm/dayjs@1/dayjs.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1/plugin/relativeTime.js"></script>
<script>
// 初始化相对时间插件
dayjs.extend(window.dayjs_plugin_relativeTime);
// 1. 基础格式化
console.log(dayjs(1627839261000).format('YYYY-MM-DD HH:mm'));
// 2021-08-01 15:34
// 2. 人性化相对时间
console.log(dayjs().subtract(3, 'minute').fromNow());
// "3分钟前"
// 3. 多语言支持(示例:中文)
dayjs.locale('zh-cn');
console.log(dayjs().startOf('day').fromNow());
// "今天"
</script>
五、经验积累
-
永远不要信任用户的时区
用Intl.DateTimeFormat().resolvedOptions().timeZone获取浏览器时区,关键时间操作以此为准 -
后端协商统一存储格式
最佳实践:存储 UTC 时间戳或 ISO8601 字符串(如2023-10-27T03:00:00Z) -
夏令时陷阱
使用'Asia/Shanghai'代替'GMT+8',内置时区数据库自动处理夏令时切换 -
Safari 的独特性
避免使用new Date('2023-10-27')这种写法,Safari 可能报错,推荐new Date('2023/10/27')或时间戳
关键点总结:原生API处理基础但繁琐,时区问题需显式声明,Day.js以微小体积提供强大格式化、相对时间和多时区支持。实际开发中,超过90%的时间操作需求可通过Day.js轻松实现。