Swift中如何获取全年所有周的起始日期与结束日期
获取当前年份全年所有周的日期范围(含跨年周)
嘿,这个需求我之前做项目时刚好碰到过,刚好可以给你分享几个实用的实现思路和代码示例,不管你用什么语言,核心逻辑都是一致的,先给你理清楚关键步骤,再拿Python和JavaScript这俩常用语言举例子~
核心逻辑梳理
要生成你要的格式(比如30 Dec - 05 Jan),关键要解决这几个问题:
- 周起始日的定义:不同地区/业务的周起始规则不一样,比如美国常用周日当第一天,ISO标准是周一当第一天,你的示例里看起来是周日起始,所以代码里要先明确这个规则。
- 跨年周的处理:年初的第一周可能从上一年12月开始,年末的最后一周可能延伸到下一年1月,得确保这些周都被包含进去。
- 日期格式化:要统一输出
DD MMM的格式(比如30 Dec),注意月份缩写是英文的,避免本地化带来的差异。
Python实现示例
用Python的datetime模块就能轻松搞定,直接上代码:
import datetime def get_year_week_ranges(year, start_week_day=7): # start_week_day: 7代表周日(对应isoweekday的规则:周一=1,周日=7) # 若要周一作为起始,把参数改成1即可 first_day = datetime.date(year, 1, 1) # 计算第一周的起始日期:找到1月1日所在周的起始日 days_to_start = (first_day.isoweekday() - start_week_day) % 7 if days_to_start != 0: days_to_start = 7 - days_to_start start_date = first_day - datetime.timedelta(days=days_to_start) week_ranges = [] current_start = start_date while True: current_end = current_start + datetime.timedelta(days=6) # 停止条件:当起始和结束日期都进入下一年时,停止循环 if current_start.year > year and current_end.year > year: break # 格式化日期为"DD MMM"格式 start_str = current_start.strftime("%d %b") end_str = current_end.strftime("%d %b") week_ranges.append(f"{start_str} - {end_str}") # 切换到下一周的起始日 current_start = current_end + datetime.timedelta(days=1) return week_ranges # 测试当前年份 current_year = datetime.datetime.now().year weeks = get_year_week_ranges(current_year, start_week_day=7) for week in weeks: print(week)
这段代码会输出你要的格式,而且支持调整周起始日,比如把start_week_day改成1,就是ISO标准的周一起始周。
JavaScript实现示例
如果是前端或者Node.js环境,用JavaScript的Date对象也能实现:
function getYearWeekRanges(year, startWeekDay=0) { // startWeekDay: 0代表周日(对应getDay()规则:周日=0,周六=6) // 若要周一作为起始,把参数改成1即可 const weekRanges = []; const firstDay = new Date(year, 0, 1); // 计算第一周的起始日期 const daysToStart = (firstDay.getDay() - startWeekDay + 7) % 7; let currentStart = new Date(firstDay); currentStart.setDate(firstDay.getDate() - daysToStart); while (true) { const currentEnd = new Date(currentStart); currentEnd.setDate(currentStart.getDate() + 6); // 停止条件:起始和结束都进入下一年 if (currentStart.getFullYear() > year && currentEnd.getFullYear() > year) { break; } // 手动定义月份缩写,避免本地化问题 const formatDate = (date) => { const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; const day = String(date.getDate()).padStart(2, '0'); const month = months[date.getMonth()]; return `${day} ${month}`; }; weekRanges.push(`${formatDate(currentStart)} - ${formatDate(currentEnd)}`); // 切换到下一周 currentStart.setDate(currentEnd.getDate() + 1); } return weekRanges; } // 测试当前年份 const currentYear = new Date().getFullYear(); const weeks = getYearWeekRanges(currentYear, 0); weeks.forEach(week => console.log(week));
这里手动定义了月份缩写数组,避免不同语言环境下月份显示不一致的问题,确保输出的是Jan、Dec这类英文缩写。
注意事项
- 周起始日调整:根据你的业务需求修改对应的参数,比如要周一当周第一天,Python里传
start_week_day=1,JavaScript里传startWeekDay=1就行。 - 日期格式化兼容:如果是其他语言(比如Java、C#),核心逻辑一样,只是日期格式化的API不同,只要照着逻辑套就行。
- 边界测试:记得测试跨年的情况,比如2025年的第一周可能是2024年12月29日到2025年1月4日,代码已经处理了这种情况。
内容的提问来源于stack exchange,提问作者Sudhir Chovatiya
相关产品推荐
相关产品推荐

