You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中如何获取全年所有周的起始日期与结束日期

获取当前年份全年所有周的日期范围(含跨年周)

嘿,这个需求我之前做项目时刚好碰到过,刚好可以给你分享几个实用的实现思路和代码示例,不管你用什么语言,核心逻辑都是一致的,先给你理清楚关键步骤,再拿Python和JavaScript这俩常用语言举例子~

核心逻辑梳理

要生成你要的格式(比如30 Dec - 05 Jan),关键要解决这几个问题:

  1. 周起始日的定义:不同地区/业务的周起始规则不一样,比如美国常用周日当第一天,ISO标准是周一当第一天,你的示例里看起来是周日起始,所以代码里要先明确这个规则。
  2. 跨年周的处理:年初的第一周可能从上一年12月开始,年末的最后一周可能延伸到下一年1月,得确保这些周都被包含进去。
  3. 日期格式化:要统一输出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:53:10