在 JavaScript 中,日期对象有两个方法可以获取日期:getMonth
和 getDate
。这两个方法的行为看起来有些奇怪,因为它们的返回值并不是我们期望的那样。
getMonth
首先,让我们看一下 getMonth
方法。这个方法返回的是一个月份值,范围从 0 到 11,分别表示一年中的 1 月到 12 月。也就是说,如果你想获取当前日期的月份,你需要写出类似这样的代码:
const date = new Date(); const month = date.getMonth(); // 返回 0 - 11 的值
这种行为看起来很奇怪,因为大多数人都是从 1 开始计数月份的。但事实上,JavaScript 中的 getMonth
行为源自 Unix 时间戳的设计,而 Unix 时间戳又是由 C 语言的时间库所定义的。C 语言中,月份是从 0 开始计数的,因此 JavaScript 的设计者沿用了这个约定。
虽然这个设计看起来没有太多的优点,但它确实简化了某些操作。例如,你可以使用 getMonth
方法直接将日期格式化成字符串:
const date = new Date(); const formattedDate = `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`; // 输出类似 "2023-4-7" 的字符串
在这个例子中,我们使用了 getMonth
返回的月份数值加 1 来获取实际的月份。
getDate
接下来,让我们看一下 getDate
方法。与 getMonth
不同,这个方法返回的是一个日期值,范围从 1 到 31,表示一个月中的第几天。例如,如果你想获取当前日期是几号,你需要写出类似这样的代码:
const date = new Date(); const dayOfMonth = date.getDate(); // 返回 1 - 31 的值
这种行为看起来比较符合我们的直觉,因为大多数人都是从 1 开始计数日期的。但实际上,这个设计也有它自己的历史渊源。
在早期的计算机系统中,日期通常被存储为一个整数值,表示距离某个特定时间点的秒数或毫秒数。当需要显示日期时,程序员将这个整数值转换成一个包含年、月、日等信息的结构体。由于人们通常是从 1 开始计数日期,因此这些结构体中的日期字段也被定义为从 1 开始计数。JavaScript 的设计者在实现日期对象时沿用了这个约定,因此 getDate
方法返回的是一个从 1 开始计数的日期值。
总结
尽管 JavaScript 中的 getMonth
和 getDate
方法行为看起来有些奇怪,但它们的设计都有其历史渊源和合理性。了解这些约定可以帮助你更好地理解和处理日期相关的问题。
当你在编写 JavaScript 代码时,记得要注意这些约定,以避免出现错误。例如,在使用 getMonth
方法时,需要将返回值加 1 才能得到实际的月份;而在使用 getDate
方法时,则不需要进行任何额外的操作。
最后,如果你想编写可靠、易于维护的 JavaScript 代码,建议你尽可能地使用标准库中提供的日期处理函数,而不是自己手动处理日期。这样可以避免很多常见的日期相关错误,同时
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/28201