Date对象无内置格式化方法;toISOString()恒返UTC时间;toLocaleString()需精确配置locale与options;getMonth()返回0–11需+1;手动格式化须区分本地/UTC时区。

JavaScript 的 Date 对象本身不提供内置的格式化方法,直接调用 toString() 或 toDateString() 得到的是本地时区、固定格式、不可控的字符串——这不是你想要的“格式化”,只是默认输出。
为什么 new Date().toISOString() 返回的是 UTC 时间?
这是最容易误解的一点:toISOString() 总是把时间转成 UTC(协调世界时),然后以 YYYY-MM-DDTHH:mm:ss.sssZ 格式返回。它不读取系统时区,也不受 toLocaleString() 设置影响。
- 如果你在东八区执行
new Date("2024-05-20T12:00:00"),再调.toISOString(),结果是"2024-05-20T04:00:00.000Z"(自动减 8 小时) - 想保留原始输入的本地时间并转 ISO 字符串?得先用
getFullYear()、getMonth()等手动拼接,或用toLocaleString("sv-SE")借助地区规则模拟 -
toISOString()的Z后缀明确表示 UTC,别把它当本地时间用
toLocaleString() 的 locale 和 options 参数怎么配才靠谱?
这个方法最灵活,但参数稍不注意就出错。关键不是“选个语言”,而是明确你要什么字段、要不要补零、用不用 12/24 小时制。
- 中文简写日期:
date.toLocaleString("zh-CN", { year: "numeric", month: "short", day: "numeric" })→"2024年5月20日" - 带秒的英文完整时间:
date.toLocaleString("en-US", { hour12: false, hour: "2-digit", minute: "2-digit", second: "2-digit" })→"14:30:45" - 月份和日期不补零?加
month: "2-digit"和day: "2-digit";想让5月变May?换month: "short"或"long" - 注意:某些旧 Android WebView 不支持
hour12: false,若需兼容,优先用hourCycle: "h23"
手写 format 函数时,getMonth() 为什么总差一个月?
getMonth() 返回的是 0~11,不是 1~12。这是 JavaScript 里最经典的“索引陷阱”,几乎每个初学者都踩过。
本书全面介绍PHP脚本语言和MySOL数据库这两种目前最流行的开源软件,主要包括PHP和MySQL基本概念、PHP扩展与应用库、日期和时间功能、PHP数据对象扩展、PHP的mysqli扩展、MySQL 5的存储例程、解发器和视图等。本书帮助读者学习PHP编程语言和MySQL数据库服务器的最佳实践,了解如何创建数据库驱动的动态Web应用程序。
立即学习“Java免费学习笔记(深入)”;
- 错误写法:
date.getMonth() + 1没问题,但如果你漏了+1,或者在条件判断里直接拿getMonth() === 12,那就永远进不去分支 - 更安全的做法是封装一个
pad(num)辅助函数,统一处理补零和偏移:function pad(n) { return n < 10 ? "0" + n : String(n); }
const m = date.getMonth() + 1;
return `${date.getFullYear()}-${pad(m)}-${pad(date.getDate())}`; - 别依赖
date.toString().slice(4, 15)截字符串——不同浏览器返回的空格数、缩写长度可能不同(比如"Mon May 20"vs"Mon May 20")
真正难的不是拼出某个格式,而是搞清你操作的是本地时间、UTC 时间,还是某个指定时区的时间。浏览器里没有原生的 date.format("yyyy-MM-dd HH:mm"),是因为标准拒绝为“看起来方便”牺牲语义准确性——一旦你开始混用 getHours() 和 getUTCHours(),或者在跨时区场景下没显式转换,bug 就藏在毫秒级偏差里。










