JavaScript日期与时间

本文介绍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<时间><时区>”,各部分定义如下:

  • <日期>完整的年份,月、日数据均使用两位数据,个位数在前面补0;年、月、日使用减号(-)连接。
  • 大写字母T为连接符。有时也习惯使用空格符代替,但字母T是标准写法。
  • <时间>使用“HH:MM:SS.sss”格式,其中HH、MM、SS为两位的时、分、秒数据,sss为毫秒数;这里,“.sss”也可以不设置,默认为000。
  • <时区>,大写字母Z表示UTC,也可以使用时区信息,如2026-06-02T16:36:56+08:00就表示北京时间2026年6月2日16点36分56秒。

Date类

JavaScript代码中使用Date类处理日期和时间信息,包括年、月、日、时、分、秒、毫秒和时间戳等。使用Date类时要特别注意,月份数据是从0开始,即0表示一月、1表示二月、……11表示十二月,这种设置虽然有些奇怪,也不能说完全没用,比如计算季度时就可以使用代码“Math.floor(m/3)+1”,其中m为Date对象中的月份值。

使用Date()构造函数获取日期和时间信息时,常用的操作包括:

  • 没有参数时返回本地系统当前日期和时间。
  • 使用一个整数时为时间戳,即距离基准时点的毫秒数。
  • 使用ISO标准的日期和时间字符串,如"2026-06-02T16:36:56+08:00"。

下面的代码演示了这几种获取日期和时间方法的应用。

JavaScript
<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。下面的代码演示了相关应用。

JavaScript
<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对象各种格式的日期和时间字符串可以使用如下方法:

  • toString()方法,返回默认格式的日期和时间字符串。
  • toLocaleString()方法,返回本地格式的日期和时间字符串。
  • toUTCString()方法,返回默认格式的UTC日期和时间字符串。
  • toISOString()方法,返回ISO标准格式的日期和时间字符串。
  • toDateString()方法,返回默认格式的日期字符串。
  • toLocaleDateString()方法,返回本地格式的日期字符串。
  • toTimeString()方法,返回默认格式的时间字符串。
  • toLocaleTimeString()方法,返回本地格式的时间字符串。

这些方法会返回日期和时间对应格式的字符串。

获取和设置日期时间数据

Date对象中可以设置和读取年、月、日、时、分、秒、毫秒数据,并获取星期几的数据,相关方法如下:

  • getFullYear()和setFullYear()方法,获取和设置本地时间的年份。
  • getUTCFullYear()和setUTCFullYear()方法,获取和设置UTC时间的年份。
  • getMonth()和setMonth()方法,获取和设置本地时间的月份。请注意,Date对象中一月到十二月对应的数值是0到11。
  • getUTCMonth()和setUTCMonth()方法,获取和设置UTC时间的月份。
  • getDate()和setDate()方法,获取和设置本地时间月份中的第几天。
  • getUTCDate()和setUTCDate()方法,获取和设置UTC时间月份中的第几天。
  • getHours()和setHours()方法,获取和设置本地时间中的小时。
  • getUTCHours()和setUTCHours()方法,获取和设置UTC时间中的小时。
  • getMinutes()和setMinutes()方法,获取和设置本地时间中的分钟。
  • getUTCMinutes()和setUTCMinutes()方法,获取和设置UTC时间中的分钟。
  • getSeconds()和setSeconds()方法,获取和设置本地时间中的秒。
  • getUTCSeconds()和setUTCSeconds()方法,获取和设置UTC时间中的秒。
  • getMilliseconds()和setMilliseconds()方法,获取和设置本地时间中的毫秒。
  • getUTCMilliseconds()和setUTCMilliseconds()方法,获取和设置UTC时间中的毫秒。
  • getDay()和getUTCDay()方法,分别获取本地和UTC时间的星期几,0表示星期日,1到6表示星期一到星期六。

这些方法中,getXXX()方法会返回对应的整数,而setXXX()方法则需要一个整数作为参数。

使用时间戳

已知日期和时间字符串时,可以使用Date.parse()方法返回对应的时间戳。下面的代码演示了Date.parse()方法的应用。

JavaScript
<script>
    alert(Date.parse("1970-01-01T01:00:00Z")); // 3600000
</script>

代码中定义的时间为中时区1970年1月1月1时,比基准时点多了一个小时,即3600秒,显示结果为3600000毫秒。

Date.UTC()方法,返回指定日期和时间对应的距离基准时点的毫秒数。其参数为年、月、日、时、分、秒、毫秒,其中,年和月必须设置,日默认为1,时间数据默认为0。下面的代码演示了Date.UTC()方法的应用。

JavaScript
<script>
    alert(Date.UTC(1970, 0, 1, 1)); // 3600000
</script>

Date对象中,使用getTime()方法获取距离基准时点的毫秒数,即对象中包含的时间戳。使用setTime()方法设置距离基准时点的毫秒数。下面的代码显示了这两个方法的应用。

JavaScript
<script>
    let ts = Date.parse("1970-01-01T01:00:00Z");
    let dt = new Date();
    dt.setTime(ts);
    alert(dt.getTime()); // 3600000
</script>

Date对象中,利用时间戳数据可以完成日期和时间的运算工作,如比较两个Date对象的大小、计算两个时间的间隔、向前或向后推算日期和时间等。

下面的代码演示了两个对象比较与计算时间间隔的操作。

JavaScript
<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对象时间戳的加法和减法运算。

日期和时间的计算,向早一些时间推算时可以减去相应的时间戳数据,向晚一些时间推算时可以加上相应的时间戳数据,下面的代码演示了相关应用。

JavaScript
<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对象,可以参考如下代码。

JavaScript
<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代码只在浏览器中工作时,可以使用浏览器环境的本地时区和格式;如果日期和时间需要在服务器处理,则应注意处理时区和统一格式问题,要确保世界各地的时间能够同步处理。