本文介绍JavaScript中日期与时间的处理,包括一些基本概念和Date类的使用,以及日期和时间推算等。
格林尼治时间(GMT,Greenwich Mean Time)。以英国格林尼治天文台作为基准时间。
协调世界时(UTC,Universal Time Coordinated),用于替代格林尼治时间作为世界标准时间。与格林尼治时间计时方式不同,UTC使用原子钟计时,并通过闰秒校准,计时更加精确;但一般应用时,UTC与格林尼治时间相差不大,很多环境下也习惯了使用GMT作为基准时间。
时区。全球共分为24个时区(经度每15度为一个时区),以格林尼治天文台所在经线为基准,东西各7.5度共15度为中时区;向东称为东时区,共12个时区,使用正数时区表示,如+08:00为东八区,也就是北京时间所在时区;向西称为西时区,共有11个时区,使用负数时区表示。在东西时区交接处,从东十二区到西十一区要减去一天。
基准时点。JavaScript中处理日期和时间以UTC时间1970年1月1日零时为基准时点;管理时间时,通过一个整数表示距离此时点的毫秒数(1秒=1000毫秒),这个整数也称为JavaScript时间戳。
ISO标准日期和时间格式为“<日期>T<时间><时区>”,各部分定义如下:
JavaScript代码中使用Date类处理日期和时间信息,包括年、月、日、时、分、秒、毫秒和时间戳等。使用Date类时要特别注意,月份数据是从0开始,即0表示一月、1表示二月、……11表示十二月,这种设置虽然有些奇怪,也不能说完全没用,比如计算季度时就可以使用代码“Math.floor(m/3)+1”,其中m为Date对象中的月份值。
使用Date()构造函数获取日期和时间信息时,常用的操作包括:
下面的代码演示了这几种获取日期和时间方法的应用。
<script> let dt1 = new Date(); let dt2 = new Date(3600_1000); let dt3 = new Date("2026-06-02T16:36:56+08:00"); // 显示时间 alert(dt1.toISOString()); alert(dt2.toISOString()); alert(dt3.toISOString()); </script>
JavaScript代码中,创建某个类型的对象时需要使用new关键字。其中,dt1对象包含了本机的当前时间。dt2对象为基准时点加上1小时,显示的ISO标准格式为"1970-01-01T01:00:00.000Z"。测试计算机的时区设置为+08:00,dt3对象设置为北京时间,显示为"2026-06-02T08:36:56.000Z",这里的UTC时间会在北京时间上减去8小时。
此外,在Date()构造函数中还可以使用多个参数设置日期和时间信息,参数顺序为年、月、日、时、分、秒、毫秒,其中,年和月必须设置,请注意月份值从0开始;日期的默认值为1;时、分、秒、毫秒的默认值为0。下面的代码演示了相关应用。
<script> let dt1 = new Date(2026, 5); let dt2 = new Date(2026, 5, 2, 16, 36, 56); alert(dt1.toISOString()); alert(dt2.toISOString()); </script>
其中,dt1对象设置的值为2026年6月1日0时,但由于本机设置时区为+08:00,所以显示的UTC时间为"2026-05-31T16:00:00.000Z"。dt2对象同样会在设置的时间上减去8小时,显示为"2026-06-02T08:36:56.000Z"。请注意,月份数值5表示六月。
获取Date对象各种格式的日期和时间字符串可以使用如下方法:
这些方法会返回日期和时间对应格式的字符串。
Date对象中可以设置和读取年、月、日、时、分、秒、毫秒数据,并获取星期几的数据,相关方法如下:
这些方法中,getXXX()方法会返回对应的整数,而setXXX()方法则需要一个整数作为参数。
已知日期和时间字符串时,可以使用Date.parse()方法返回对应的时间戳。下面的代码演示了Date.parse()方法的应用。
<script> alert(Date.parse("1970-01-01T01:00:00Z")); // 3600000 </script>
代码中定义的时间为中时区1970年1月1月1时,比基准时点多了一个小时,即3600秒,显示结果为3600000毫秒。
Date.UTC()方法,返回指定日期和时间对应的距离基准时点的毫秒数。其参数为年、月、日、时、分、秒、毫秒,其中,年和月必须设置,日默认为1,时间数据默认为0。下面的代码演示了Date.UTC()方法的应用。
<script> alert(Date.UTC(1970, 0, 1, 1)); // 3600000 </script>
Date对象中,使用getTime()方法获取距离基准时点的毫秒数,即对象中包含的时间戳。使用setTime()方法设置距离基准时点的毫秒数。下面的代码显示了这两个方法的应用。
<script> let ts = Date.parse("1970-01-01T01:00:00Z"); let dt = new Date(); dt.setTime(ts); alert(dt.getTime()); // 3600000 </script>
Date对象中,利用时间戳数据可以完成日期和时间的运算工作,如比较两个Date对象的大小、计算两个时间的间隔、向前或向后推算日期和时间等。
下面的代码演示了两个对象比较与计算时间间隔的操作。
<script> let dt1 = new Date("1970-01-01T01:00:00Z"); let dt2 = new Date("1970-01-01T02:00:00Z"); alert(dt1 > dt2); // false alert(dt1 < dt2); // true alert(dt2 - dt1); // 3600000 alert(dt1 - dt2); // -3600000 </script>
代码中,首先定义了dt1和dt2两个Date对象,其中dt2比dt1晚了一个小时。第一个输出,比较dt1大于dt2,由于dt1早于dt2,时间戳会小一些,所以结果为false。第二个输出,dt1的时间戳小于dt2,结果为true。第三个和第四个输出,实际执行的是两个Date对象时间戳的加法和减法运算。
日期和时间的计算,向早一些时间推算时可以减去相应的时间戳数据,向晚一些时间推算时可以加上相应的时间戳数据,下面的代码演示了相关应用。
<script> let dt1 = new Date("1970-01-01T01:00:00Z"); dt1.setTime(dt1.getTime() + 3600_000); alert(dt1.toISOString()); // 1970-01-01T02:00:00Z </script>
本例,dt1会在自身时间上加一小时。如果需要将计算结果保存到新的Date对象,可以参考如下代码。
<script> let dt1 = new Date("1970-01-01T01:00:00Z"); let dt2 = new Date(dt1.getTime() + 3600_000); alert(dt2.toISOString()); // 1970-01-01T02:00:00Z </script>
代码中,dt2会比dt1晚一个小时。
应用中处理日期和时间,最重要的是要统一标准,如使用什么时区、使用什么格式等。JavaScript代码只在浏览器中工作时,可以使用浏览器环境的本地时区和格式;如果日期和时间需要在服务器处理,则应注意处理时区和统一格式问题,要确保世界各地的时间能够同步处理。