JS判断2个时间是否在同一周

本文介绍了两个实用的JavaScript函数:一个是用于判断两个日期是否属于同一周的isSameWeek函数,另一个是比较两个日期大小的compareDate函数。通过这两个函数,可以方便地进行日期相关操作。
function isSameWeek(old, now) {
    var oneDayTime = 1000 * 60 * 60 * 24;
    var old_count = parseInt(+old / oneDayTime);
    var now_other = parseInt(+now / oneDayTime);
    return parseInt((old_count + 4) / 7) == parseInt((now_other + 4) / 7);
}  

function compareDate(date1, date2) {
    var oDate1 = new Date(date1);
    var oDate2 = new Date(date2);
    if (oDate1.getTime() >= oDate2.getTime()) {
        return true;
    } else {
        return false;
    }
}
<think>我们有一个任务:判断两个时间字符串是否越不同的。思路:1.将时间字符串转换为日期对象。2.获取每个日期对象的数(注意:一的开始可能是日或一,这里我们按ISO来算?或者按本地?)但是问题没有明确,通常业务中我们可能按一开始为一的第一天,或者按日开始。这里我们可以使用ISO一为一的第一天,并且第一是包含该年第一个星期四的那一),或者我们可以使用本地(根据系统设置)。不过,题目要求是“”,即判断两个时间是否同一内。我们可以这样定义:如果两个时间同一内(以一为开始,日为结束,或者以日为开始,六为结束),则没有;否则。但是,JavaScript的Date对象提供了getDay()方法(返回0(日)到6(六)),我们可以根据这个来计算数。然而,由于不同地区对一的开始定义不同,我们通常需要统一标准。这里我们采用ISO标准:一为一的第一天,并且使用getDay()来调整。另一种简单方法:计算两个日期之间的时间差,然后判断它们是否同一个“”内。我们可以取第一个日期的一(或日)作为基准,然后看第二个日期是否同一一(或日)到日(或六)之间。但是,更通用的方法是:计算每个日期所在的的开始日期(例如,如果一一开始,那么就将日期调整到当一;如果一日开始,就调整到当日)。然后比较两个日期所在的的开始日期是否相同。由于题目没有指定一的开始是哪一天,我们通常按照ISO标准(一为开始)或者按照美国标准(日为开始)?这里我们可以让用户指定,但题目没有说明,所以我们先按照ISO(国际标准)来处理。按照ISO,我们可以这样计算一个日期所在的一的日期:-先得到日期是星期几(getDay(),0是日,1一,6六)-如果getDay()为0(日),那么我们需要减去6天得到上一个一?还是说我们定义一的开始为一,那么日属于上一?-ISO标准:一的星期一是第1天,星期天是第7天。因此,要计算一个日期所在一,我们可以:letday=date.getDay();//0是日,1一,2二...6六letdiff=date.getDate()-(day===0?6:day-1);但是这样不对,因为如果day=0(日),那么它属于下一吗?实际上ISO标准中,一的getDay()是1,日的getDay()是0(但ISO规定日是第7天,属于本)。然而,在ISO中,一一开始,日结束。所以:一:1->不需要调整二:2->减去1天三:3->减去2四:4->减去3天五:5->减去4天六:6->减去5天日:0->减去6天(因为日是本的最后一天,所以它属于本,那么本一就是6天前)所以,计算本一的日期(ISO标准):letday=date.getDay();letmonday=newDate(date);monday.setDate(date.getDate()-(day===0?6:day-1));然后,比较两个日期对应的是否同一天(注意:只比较年月日,忽略时间)。但是,题目要求是判断两个时间字符串是否,即是否同一内(ISO)。那么,我们只需要计算两个日期对应的ISO一,然后比较这两个是否相同。步骤:1.将两个时间字符串转换为Date对象(注意:字符串格式,参考引用[2]中的转换方法,我们使用替换将横杠换成斜杠,因为Safari浏览器不支持横杠格式)。2.对每个Date对象,计算其所在一(按ISO标准)。3.比较两个是否相等(比较年月日)。但是,还有一种情况:两个时间可能在同一,但是一个在一,一个在日,这样它们还是同一。所以比较一即可。注意:如果两个时间相差超过一,那么肯定。但是我们的方法通过比较一,如果一相同则同一,否则不同。另外,如果两个日期不在同一年,那么肯定(因为一是不同的年份和日期)。所以我们的方法自然可以处理。但是,ISO还有一个问题:一年的第一和最后一可能年。例如,2019年12月31日与2020年1月1日可能在同一(如果2020年1月1日是三,那么2019年12月30日(一)就是这一的开始,这一属于2020年的第1)。但是,我们的方法只比较一的日期,那么2019年12月30日(一)和2020年1月6日(一)就不一样。所以我们的方法正确。因此,我们可以这样实现:函数:isCrossWeek(str1,str2)1.转换字符串为日期对象。2.对每个日期对象,计算其所在一(ISO标准:一为一的第一天)。3.比较两个一(只比较年月日)是否相等。4.如果相等,则没有同一),返回false;否则,返回true。注意:如果输入的时间字符串包含时间部分,我们只关心日期部分(因为是按天划分的)。但是我们的转换会保留时间,不过我们在计算一的时候,会按天调整,然后比较的时候只比较日期部分(年月日)。但是,我们也可以将两个一的时分秒都设为0,然后比较时间戳?或者只比较年月日。比较年月日的方法:monday1.getFullYear()===monday2.getFullYear()&&monday1.getMonth()===monday2.getMonth()&&monday1.getDate()===monday2.getDate()或者,我们可以将两个一的时分秒毫秒设为0,然后比较时间是否相等。但是,由于我们只关心日期,所以将时间设为0再比较也可以。我们采用:将计算出的一的时间都设置为0点(避免时间不同影响),然后比较时间戳。步骤细化:转换函数(参考引用[2]):functiontoDate(str){//将横杠替换为斜杠,兼容Safaristr=str.replace(/-/g,'/');returnnewDate(str);}计算一(ISO标准):functiongetMonday(date){letday=date.getDay();//如果day为0(日),那么需要减去6天;否则减去day-1天letdiff=day===0?6:day-1;letmonday=newDate(date);monday.setDate(date.getDate()-diff);//将时间部分设置为0monday.setHours(0,0,0,0);returnmonday;}然后比较两个一的时间戳:returngetMonday(date1).getTime()!==getMonday(date2).getTime();注意:如果两个日期都是无效的,需要处理异常。但是,题目没有要求处理异常,我们假设输入是有效的时间字符串。另外,我们也可以考虑使用UTC时间,但是这里我们使用本地时间即可,因为一的划分通常按本地时间。但是,ISO的计算通常使用UTC?不,我们这里按本地时间计算一是没问题的。因此,代码实现如下:</think>在 JavaScript 中判断两个时间字符串是否越不同的,可通过以下步骤实现: ### 解决方案 1. **时间字符串转日期对象** 使用 `new Date()` 转换字符串,注意处理格式兼容性(替换 `-` 为 `/`): ```javascript function parseDate(str) { return new Date(str.replace(/-/g, '/')); } ``` 2. **计算每起始日(一)** 根据 ISO 8601 标准(一为一起点)计算日期所在的一: ```javascript function getWeekStart(date) { const day = date.getDay(); // 0(日)~6(六) const diff = day === 0 ? 6 : day - 1; // 一偏移量 const monday = new Date(date); monday.setDate(date.getDate() - diff); return monday; } ``` 3. **比较起始日** 比较两个日期对应的是否相同: ```javascript function isCrossWeek(str1, str2) { const date1 = parseDate(str1); const date2 = parseDate(str2); const monday1 = getWeekStart(date1); const monday2 = getWeekStart(date2); // 比较年月日是否一致 return monday1.getFullYear() !== monday2.getFullYear() || monday1.getMonth() !== monday2.getMonth() || monday1.getDate() !== monday2.getDate(); } ``` ### 使用示例 ```javascript // 测试 console.log(isCrossWeek("2023-05-15", "2023-05-22")); // true (不同) // 测试同 console.log(isCrossWeek("2023-05-15", "2023-05-16")); // false (同一) ``` ### 关键逻辑说明 1. **起始定义**:`getWeekStart()` 将一作为一起点,通过日期偏移实现: - 当日期为日(`day=0`)时,回退 6 天至一 - 其他日期回退 `day-1` 天(如二回退 1 天) 2. **判断**:比较两个日期对应的是否在不同年月日,满足任一条件即 3. **时区处理**:使用本地时区计算,符合日常业务场景需求[^1] > 注意:此方案基于 ISO 定义(一为起点),如需日为起点,修改 `getWeekStart()` 中的偏移逻辑即可。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值