JavaScript日期处理实用技巧:比较、范围判断与格式转换

作者:桌面漫游时间:2026-10-29 22:56:25浏览:417

本文分享了JavaScript中常用的日期处理技巧,包括两个日期的先后比较、判断日期是否处于指定区间、一行代码实现闰年检测,以及计算国庆、春节等重大节日前后状态的方法,同时提供了获取星期几的多种代码实现方案。

JavaScript日期比较与区间判断

在JavaScript中,比较两个日期的先后顺序可以通过创建Date对象并调用getTime()方法获取时间戳来实现。如果两个Date对象的时间戳相等,则说明这两个日期相同。例如,创建两个分别代表2015年5月25日的Date对象,通过比较它们的getTime()返回值可以判断日期是否一致。


var x = new Date('2015-05-25'); 
var y = new Date('2015-05-25'); 
 
if (x.getTime() == y.getTime()) { 
 It'll be true; 
} 

判断一个特定时间是否位于两个日期之间,通常用于处理节假日或特定时间段内的逻辑。代码中通过遍历春节日期数组,计算春节前后几天的时间范围(前4天至后若干天),并将目标时间与该范围进行比对。若目标时间落在计算出的beforeSpringDate和afterSpringDate之间,则返回true并跳出循环。


var beforeSpringDate, afterSpringDate; 
 for (var i = 0; i < springFestivalDays.length; i++) { 
 beforeSpringDate = new Date(springFestivalDays[i]); 
 beforeSpringDate.setDate(beforeSpringDate.getDate() - 4); 
 afterSpringDate = new Date(springFestivalDays[i]); 
 afterSpringDate.setDate(afterSpringDate.getDate() + springFestivalPeriod - 1); 
 if (time >= beforeSpringDate.getTime() && time <= afterSpringDate.getTime()) { 
  result = true; 
  break; 
 } 
 } 

闰年判断与节日状态计算

利用JavaScript Date对象的特性,可以非常简洁地判断闰年。核心思路是尝试创建一个指定年份2月29日的Date对象。如果该月份实际只有28天,Date对象会自动将日期修正为3月1日,此时getDate()返回1;若2月确实有29天,则getDate()返回29。通过比较getDate()是否等于29,即可判断该年是否为闰年。示例中展示了2012年为闰年,而2013、2014年为非闰年的测试结果。


var input = new Date();new Date(input.getFullYear(), 1, 29).getDate() === 29 
false 
 
var input = new Date(2012,1,1);new Date(input.getFullYear(), 1, 29).getDate() === 29 
true 
 
var input = new Date(2013,1,1);new Date(input.getFullYear(), 1, 29).getDate() === 29 
false 
 
var input = new Date(2014,1,1);new Date(input.getFullYear(), 1, 29).getDate() === 29 
false 
 
var input = new Date(2014,5,1);new Date(input.getFullYear(), 1, 29).getDate() === 29 
false 
 
var input = new Date(2014,6,1);new Date(input.getFullYear(), 1, 29).getDate() === 29 
false 
 
var input = new Date(2016,6,1);new Date(input.getFullYear(), 1, 29).getDate() === 29 
true 
 
var input = new Date(2000,6,1);new Date(input.getFullYear(), 1, 29).getDate() === 29 
true 

判断重大节日(如国庆、春节)前后一周的状态,可以通过定义一个包含节日逻辑的对象来实现。以国庆节为例,代码检查月份是否为9月且日期在24日至30日之间(节前),或月份为10月且日期在1日至7日之间(节中)。类似地,春节的状态也通过计算春节前后几天的范围来确定。最终,函数返回一个包含beforeNationalDay、duringNationalDay等状态的对象,供外部调用判断当前日期是否处于节日影响范围内。


var holiday = {}; 
 
function inNationalDay(date) { 
 var result = { 
 beforeNationalDay: false, 
 duringNationalDay: false 
 }; 
 if (date) { 
 var month = date.getMonth() + 1, 
  day = date.getDate(); 
 if (month == 9 && (day >= 24 && day <= 30)) { 
  result.beforeNationalDay = true; 
 } else if(month == 10 && (day >= 1 && day <= 7)) { 
  result.duringNationalDay = true; 
 } 
 } 
 return result; 
} 
 
function inSpringFestival(date) { 
 var result = { 
 beforeSpringFestival: false, 
 duringSpringFestival: false 
 }; 
 if (date) { 
 // set GMT+0800 hours(set china hour +8) 
 date = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 8); 
 var time = date.getTime(); 
 var springFestivalDays = ['2015-02-19', '2016-02-08', '2017-01-28', '2018-02-16', '2019-02-05', 
  '2020-01-25', '2021-02-12', '2022-02-01', '2023-01-22', '2024-02-10']; 
 
 var springDay, springDate, beforeSpringDate, afterSpringDate; 
 for (var i = 0; i < springFestivalDays.length; i++) { 
  springDay = springFestivalDays[i]; 
  springDate = new Date(springDay); 
  beforeSpringDate = new Date(springDay); 
  beforeSpringDate.setDate(beforeSpringDate.getDate() - 7); 
  afterSpringDate = new Date(springDay); 
  afterSpringDate.setDate(afterSpringDate.getDate() + 7); 
  if (time >= beforeSpringDate.getTime() && time < springDate.getTime()) { 
  result.beforeSpringFestival = true; 
  break; 
  } else if (time >= springDate.getTime() && time < afterSpringDate.getTime()) { 
  result.duringSpringFestival = true; 
  break; 
  } 
 } 
 } 
 
 return result; 
} 
 
holiday.cache = { 
 lastUpdateDate: null, 
 beforeHoliday: false, 
 duringHoliday: false 
}; 
 
holiday.checkHoliday = function() { 
 var now = new Date(); 
 if (!holiday.cache.lastUpdateDate) { 
 holiday.cache.lastUpdateDate = now; 
 var nationalDayResult = inNationalDay(now); 
 var springFestivalResult = inSpringFestival(now); 
 holiday.cache.beforeHoliday = nationalDayResult.beforeNationalDay || springFestivalResult.beforeSpringFestival; 
 holiday.cache.duringHoliday = nationalDayResult.duringNationalDay || springFestivalResult.duringSpringFestival; 
 } else { 
 var lastUpdateDate = holiday.cache.lastUpdateDate; 
 var cacheDate = lastUpdateDate.getFullYear() + '' + lastUpdateDate.getMonth() + '' + lastUpdateDate.getDate(); 
 var nowDate = now.getFullYear() + '' + now.getMonth() + '' + now.getDate(); 
 if (cacheDate != nowDate) { 
  holiday.cache.lastUpdateDate = now; 
  var nationalDayResult = inNationalDay(now); 
  var springFestivalResult = inSpringFestival(now); 
  holiday.cache.beforeHoliday = nationalDayResult.beforeNationalDay || springFestivalResult.beforeSpringFestival; 
  holiday.cache.duringHoliday = nationalDayResult.duringNationalDay || springFestivalResult.duringSpringFestival; 
 } 
 } 
}; 
 
module.exports = holiday; 

获取星期几的多种实现方式

获取指定日期是星期几,可以通过Date对象的getDay()方法实现。该方法返回0到6之间的整数,分别代表周日到周六。一种简便的写法是将“天一二三四五六”作为字符串,利用getDay()返回的索引值通过charAt()方法直接获取对应的中文星期表示。例如,将“2011-11-17”转换为Date对象后,调用getDay()并结合字符串索引,即可弹出提示框显示“今天星期天”。


<SCRIPT> 
var s = '2011-11-17'; 
alert( "今天星期 "+"天一二三四五六 ".charAt(new Date(s).getDay())); 
alert("星期 " + new Date(s).getDay()); 
</SCRIPT> 

另一种获取星期几的方式是使用数组映射。首先定义一个包含“星期天”到“星期六”的数组weekDay,然后将日期字符串中的“-”替换为“/”以确保兼容性,并通过Date.parse()转换为时间戳创建Date对象。最后,利用getDay()返回的索引值从数组中取出对应的星期字符串并显示。这种方法逻辑清晰,易于扩展和维护。


var weekDay = ["星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]; 
  var dateStr = "2008-08-08"; 
  var myDate = new Date(Date.parse(dateStr.replace(/-/g, "/"))); 
  alert(weekDay[myDate.getDay()]); 

作者最新文章