JavaScript 的 Date 对象本身没有直接返回“两位数格式”字符串的方法(例如 getHours() 永远返回数字 0-23,而不是字符串 "09")。
要实现 10:07:21 这种效果,必须对获取到的数字进行格式化补零。以下是三种最常用且简洁的方法:
方法一:使用 padStart()(推荐,现代写法)
这是目前最标准、代码最简洁的方式。将数字转为字符串后,如果长度不足2位,则在前面补 0。
var now = new Date(); var hour = String(now.getHours()).padStart(2, '0'); // "09" 或 "10" var minute = String(now.getMinutes()).padStart(2, '0'); // "07" var second = String(now.getSeconds()).padStart(2, '0'); // "05" console.log(hour + ":" + minute + ":" + second); // 输出例如: 10:07:05
方法二:使用三元运算符(兼容性好)
判断数字是否小于10,如果是,手动拼接一个 "0"。
var now = new Date(); var h = now.getHours(); var m = now.getMinutes(); var s = now.getSeconds(); // 如果小于10,前面加"0",否则保持原样(并转为字符串以防类型混合) var hour = h < 10 ? "0" + h : h; var minute = m < 10 ? "0" + m : m; var second = s < 10 ? "0" + s : s; console.log(hour + ":" + minute + ":" + second);
方法三:使用 toLocaleTimeString()(最省事,但格式受系统影响)
如果你不需要自定义格式(如“年-月-日”),只想快速得到本地化的时间字符串,可以直接使用这个方法。它会自动处理补零和上午/下午标记。
var now = new Date();
// 返回类似 "10:07:05" 或 "上午10:07:05" (取决于浏览器和系统设置)
var timeString = now.toLocaleTimeString('zh-CN', { hour12: false });
console.log(timeString);注意:hour12: false 强制使用24小时制。如果不加这个选项,在某些系统上可能会显示为 "上午10:07:05"。
修改你之前的代码
结合你之前的代码,建议采用方法一进行修改,既清晰又规范:
<script>
var now = new Date();
var year = now.getFullYear();
// 月份和日期也建议补零,保持美观,如 2026-08-05
var month = String(now.getMonth() + 1).padStart(2, '0');
var date = String(now.getDate()).padStart(2, '0');
var day = now.getDay();
var weekArr = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
var week = weekArr[day]; // 使用数组映射比 switch 更简洁
// 时分秒补零
var hour = String(now.getHours()).padStart(2, '0');
var minute = String(now.getMinutes()).padStart(2, '0');
var second = String(now.getSeconds()).padStart(2, '0');
document.write("<span style='font-size:24px;'>");
document.write("今天是:" + year + "年" + month + "月" + date + "日 " + week);
document.write("<br>现在是:" + hour + ":" + minute + ":" + second);
document.write("</span>");
</script>主要改进点:
补零:使用了
.padStart(2, '0'),确保9变成09。星期优化:原代码中
switch写法繁琐且default逻辑有误(周日被写成星期一),改用数组weekArr[day]更准确且代码更少。月份修正:
getMonth()返回 0-11,所以必须+1。
详细讲讲这个.padStart
padStart() 是 JavaScript ES2017 (ES8) 引入的一个字符串实例方法,主要用于在字符串的头部(左侧)填充字符,直到字符串达到指定的长度。
它在处理时间、日期、金额等需要固定宽度的格式化场景中非常有用(例如将 9 变为 09)。
基本语法
str.padStart(targetLength [, padString])
targetLength (必填):当前字符串需要填充到的目标总长度。
如果该值小于或等于原字符串的长度,则原样返回字符串,不进行填充。
padString (可选):用于填充的字符串。
默认值:空格
" "(U+0020)。如果提供的填充字符串长度超过所需长度,它会被截断(只保留左边部分)。
如果提供的填充字符串长度不足,它会重复拼接直到满足长度要求。
2. 核心用法示例
A. 数字补零(最常用场景)
由于 padStart 是字符串方法,使用前需先将数字转换为字符串。
// 场景:时间格式化,确保两位数 let hour = 9; let minute = 5; // 错误写法:数字没有 padStart 方法 // hour.padStart(2, '0') -> 报错 // 正确写法:先转字符串 String(hour).padStart(2, '0'); // "09" String(minute).padStart(2, '0'); // "05" // 如果已经是两位数,不会受影响 String(12).padStart(2, '0'); // "12"
B. 默认填充空格
如果不传第二个参数,默认用空格填充,常用于对齐文本。
"abc".padStart(6); // 结果: " abc" (前面有3个空格)
C. 自定义填充字符
可以使用任意字符进行填充。
"abc".padStart(10, "*"); // 结果: "‌*******‌abc" "abc".padStart(10, "foo"); // 结果: "foofoofabc" // 解析:需要填充7位。"foo"重复两次是"foofoo"(6位),再取"foo"的第一个字符"f",共7位。
D. 目标长度小于原长度
如果 targetLength 比原字符串短,字符串保持不变。
"hello".padStart(3, "x"); // 结果: "hello" (因为 5 > 3,不处理)
3. 注意事项与细节
必须作用于字符串:
Number类型没有padStart方法。务必使用String(num)或num.toString()转换。
// ❌ 报错 5.padStart(2, '0'); // ✅ 正确 (5).toString().padStart(2, '0'); String(5).padStart(2, '0');
填充字符串的截断逻辑:
填充是从左向右进行的。如果填充字符串太长,多余的右侧部分会被丢弃。
"abc".padStart(5, "123456"); // 需要填充2位。取"123456"的前两位 "12"。 // 结果: "12abc"
兼容性:
padStart是 ES2017 标准。现代浏览器(Chrome, Firefox, Safari, Edge)均完美支持。
IE11 及以下版本不支持。如果需要兼容旧版 IE,需要使用 polyfill 或改用传统的三元运算符判断(如
num < 10 ? '0' + num : num)。
4. 对比:padEnd()
padStart():在开头填充(左对齐内容的视觉补充,如时间09:05)。padEnd():在末尾填充(右对齐内容的视觉补充,如表格对齐Name.....)。
5. 实际应用场景代码
结合你之前的时间显示需求,完整的优化代码如下:
var now = new Date();
// 获取各部分数值
var year = now.getFullYear();
var month = now.getMonth() + 1; // 月份从0开始,需+1
var date = now.getDate();
var hour = now.getHours();
var minute = now.getMinutes();
var second = now.getSeconds();
// 使用 padStart 统一格式化为两位字符串
var strMonth = String(month).padStart(2, '0');
var strDate = String(date).padStart(2, '0');
var strHour = String(hour).padStart(2, '0');
var strMinute = String(minute).padStart(2, '0');
var strSecond = String(second).padStart(2, '0');
// 星期处理
var weekArr = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
var week = weekArr[now.getDay()];
// 输出
console.log(`今天是:${year}年${strMonth}月${strDate}日 ${week}`);
console.log(`现在是:${strHour}:${strMinute}:${strSecond}`);
// 输出示例: 今天是:2026年08月21日 星期五
// 输出示例: 现在是:10:05:03这种方式比传统的 if (month < 10) month = '0' + month 更简洁、可读性更强,且不易出错。