计算某个日期为当年的第几周

67 阅读2分钟

要求:如果1月1号不是周一,那么1月1号就不属于当年的第一周(需求是以周一作为一周的开始)。比如:2021.01.01是周五,它是属于2020年的最后一周,2021年的第一周的第一天是2021.01.04;2023.01.01是周日,它是属于2022年的最后一周,2023年的第一周的第一天是2023.01.02。

算法思路:如果1月1号不是周一,就取下一周的周一作为今年的起始日(真实起始日),用某个目标日期距离“真实起始日”的天数除于7向上去整就是得出的结果了。

用Salesforce实现:(其他编程语言没有了解,很多内置方法应该还是有的,比如取当前日期距离某个日期有多少天)

// 目标日期 
Date currencyDay = Date.newInstance(2022, 1, 3);

// 目标日期距离1月1日天数
Integer daysBetween = currencyDay.dayOfYear(); 

// 距离的天数/7 向上去整就是得到的周数 
Decimal weeks = Math.ceil((Double) daysBetween / 7); 

// ==== 如果1月1日不是周一,走下面的流程 ====

// 目标日期的年份 
Integer currencyYear = currencyDay.year(); 

// 目标日期的1月1号 
Date startDateOfYear = Date.newInstance(currencyYear, 1, 1); 

// 1月1号那周的起始日期,也就是那一周的周日(这里拿到的是国际标准) 
Date startSundayOfYear = startDateOfYear.toStartOfWeek();

// 1月1号是那周的周几(0代表周日) 
Integer dayOfWeekIndex = startSundayOfYear.daysBetween(startDateOfYear); 
System.debug(currencyYear + '年1月1号是:周' + dayOfWeekIndex); 

if (dayOfWeekIndex != 1) { 
    // 1月1日不是周一,找到下周一(+7是下周日,+8是下周一),1月1号的那周的起始是周日,+7就是下周日 
    Date realMonday = startSundayOfYear.addDays(8); 
    
    // 1月1日距离下周一差距的天数
    Integer daysDistance = startDateOfYear.daysBetween(realMonday);
    
    if (dayOfWeekIndex == 0) { 
        // 1月1日是周日,距离下周一差1天 
        daysDistance = 1; 
    } 
    
    System.debug(currencyYear + '年1月1日距离“下周一”差的天数:' + daysDistance); 
    System.debug('目标日期距离当年的1月1日天数差:' + daysBetween);
   
    weeks = Math.ceil((Double) (daysBetween - daysDistance) / 7); 
} 

System.debug('结果:' + weeks);