正在加载...

JavaScript 日期

一刷新,电脑的「现在」就会把例子换掉。所以先把一个早晨钉死:阅览室在 2024 年 3 月 14 日星期四上午 9:30 开门。后面每一个数,都从这个早晨里读,不从墙上的钟里读。

你不是在名单里找

上一课在数组里找,到手的是格子、−1、有还是没有、或者邮票本身。日期不是从名单里捞的。你先把时刻造好,再一次只问它一件事。问,不会把时针往前拨。

就这一早的六个数

不要把方法名当成词典来背。看这个星期四上,每个问题对上哪个数,又容易跟旁边哪个数对调。

📊 这个星期四的纸条

方法 你真正在问 这一早的数字 常对调的那个
getFullYear 年份写全 2024 写成 24
getMonth 三月在对象里停在哪 2 按挂历读成 3
getDate 这个月的几号 14 星期四的编号
getDay 星期四在一周里的位置 4 14 号
getHours 从 0 到 23 的小时 9 再找一个「上午」标记
getMinutes 分钟 30 向小时去要 30

一月是 0,二月是 1,三月就是 2。星期日是 0,星期一 1,星期二 2,星期三 3,星期四 4。数组里的 0 是第一格。这里的 0 是一年和一周的开头。

先把年份拿开

露出来的只有最前头那个:2024,一位不删。日子、小时、分钟这一行碰都不碰。

这个星期四的年份

javascript
let opened = new Date(2024, 2, 14, 9, 30);
console.log(opened.getFullYear());

你看到的是 2024,因为第一格放的就是它。当作月份放进去的 2 不会印在这一行上,可对象一造好,它就已经是三月。24 是写在纸上的缩写,不是这次读取。

对象里的三月

javascript
let opened = new Date(2024, 2, 14, 9, 30);
console.log(opened.getMonth());

看见 2 别急着加。一月占了 0,三月就落在这里。挂历把三月数成第三个月,那一格要等写给人看的句子时再挪。这一行先让 2 待着。

十四号和星期四

javascript
let opened = new Date(2024, 2, 14, 9, 30);
console.log(opened.getDate());
console.log(opened.getDay());

14 是这个月的几号,4 是把星期日当成 0 之后的星期四。两行挨着,是因为你问了两件事,不是因为它们是同一个问题。方法拿反了,就会把日期当成星期的名字,或者反过来。

九点半

javascript
let opened = new Date(2024, 2, 14, 9, 30);
console.log(opened.getHours());
console.log(opened.getMinutes());

先是 9,后是 30。小时从午夜的 0 走到 23,所以这个 9 就是上午,不必再挂一块「午前」的牌子。30 是分钟。向小时去要它,就是看错了指针。

二十号的来访

javascript
let opened = new Date(2024, 2, 14, 9, 30);
let visit = new Date(2024, 2, 20, 15, 0);
console.log(visit.getTime() > opened.getTime());
console.log(visit.getDate());

来访是 3 月 20 日下午 3 点,比开馆晚。getTime 把每个时刻变成一个能分先后的数,比较的结果是 true。下一行的 20 是来访那天,不是比较的结果。=== 不问谁先谁后。它只问这两个名字是不是指着同一个对象。这里你造了两个。

不看代码的人读到的那一句

年份和日子照原样拿。月份按挂历的数法来写。

给读者的一行

html
<!DOCTYPE html>
<html>
<head>
<title>dates — page</title>
</head>
<body>
<p id="when">…</p>
<script>
let opened = new Date(2024, 2, 14, 9, 30);
let year = opened.getFullYear();
let displayMonth = opened.getMonth() + 1;
let day = opened.getDate();
let box = document.getElementById("when");
box.textContent = year + "-" + displayMonth + "-" + day;
</script>
</body>
</html>

段落上是 2024-3-14。你再问对象月份,它仍是 2。往前挪的那一格,只活在给眼睛看的句子里。存着的早晨没有动。

这个早晨要对上的六处

对纸条,别猜。

  1. 年份写全是 2024,不是 24
  2. 对象里面三月是 2
  3. 14 来自 getDate,星期四的 4 来自 getDay
  4. 小时是 9,分钟是 30
  5. 二十号的来访更晚,比较是 true,那天是 20
  6. 段落里的句子是 2024-3-14,对象仍把月份留在 2

程序照跑,日子却错了

没有报错。变掉的只是你以为自己读到的那个月或那个数。

  • 想要三月,却把 3 交给 new Date,造出来的是四月
  • 把 2 读成二月,或者非要 getMonth 给出 3
  • 向 getDay 去要 14
  • 向 getDate 去要星期四的 4
  • 用 === 判断哪个时刻更晚
  • 不带数字调用 new Date(),一刷新早晨就换成另一个

合上这一页还该留着的

  • 三月是 2,因为一月是 0
  • 这个月的几号靠 getDate
  • 星期几靠 getDay,星期日是 0
  • 两个时刻的先后,靠 getTime 给出的那个数
  • 人读到的句子把月份写得比对象里靠前一格,对象仍停在 2
  • 下一页是 Math 对象

🧠 测试您的知识

准备开始

测试您的知识

通过这个互动测验挑战自己,看看你对这个主题的理解程度如何

❓
8
问题
🎯
70%
及格要求
♾️
∞
时间
🔄
∞
尝试次数

📝 说明

  • 仔细阅读每个问题
  • 为每个问题选择最佳答案
  • 您可以随时重新参加测验
  • 您的进度将显示在顶部