要求:如果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)