如何使用 Java、Python、PHP、Golang、Swift 和 Ruby 获取当前是一年里的第几周

在统计报表、排期与调度中,计算“第几周”常见却易错,尤其是跨年边界。统一采用 ISO 8601 周历并成对获取“ISO 年份 + ISO 周数”,可避免绝大多数问题。

对比表:各语言获取 ISO 年份与周数

语言/库 获取 ISO 年份 获取 ISO 周数 必要设置 备注
Go t.ISOWeek() 返回 (year, week) t.ISOWeek() 返回 (year, week) 一次调用即得两者
Python d.isocalendar()[0] d.isocalendar()[1] isocalendar() 返回 (year, week, weekday)
Java (java.time) date.get(WeekFields.ISO.weekBasedYear()) date.get(WeekFields.ISO.weekOfWeekBasedYear()) 使用 WeekFields.ISO 不要用 locale 依赖的周字段
PHP format('o') format('W') o 为 ISO 年份,W 为 ISO 周数
Swift .component(.yearForWeekOfYear, from:) .component(.weekOfYear, from:) Calendar(identifier: .iso8601) 必须用 ISO 日历
Ruby d.cwyear d.cweek cwyear/cweek 即 ISO 年/周

ISO 8601 要点

边界示例:

各语言实现

Go

package iso

import "time"

// 返回 ISO 年份与 ISO 周数
func GetISOWeek(t time.Time) (int, int) {
    year, week := t.ISOWeek()
    return year, week
}

Python

from datetime import date

# 返回 (ISO 年份, ISO 周数)
def get_iso_week(d: date) -> tuple[int, int]:
    iso_year, iso_week, _ = d.isocalendar()
    return iso_year, iso_week

Java (java.time)

import java.time.LocalDate;
import java.time.temporal.WeekFields;

public final class IsoWeek {
    private IsoWeek() {}

    public static int getIsoWeek(LocalDate date) {
        return date.get(WeekFields.ISO.weekOfWeekBasedYear());
    }

    public static int getIsoWeekYear(LocalDate date) {
        return date.get(WeekFields.ISO.weekBasedYear());
    }
}

PHP

<?php
// 返回 [ISO 年份, ISO 周数]
function get_iso_week(DateTimeInterface $dt): array {
    $isoYear = (int)$dt->format('o'); // ISO 年份
    $isoWeek = (int)$dt->format('W'); // ISO 周数
    return [$isoYear, $isoWeek];
}

Swift

import Foundation

// 返回 (ISO 年份, ISO 周数)
func getIsoWeek(from date: Date,
                calendar: Calendar = Calendar(identifier: .iso8601)) -> (year: Int, week: Int) {
    let year = calendar.component(.yearForWeekOfYear, from: date)
    let week = calendar.component(.weekOfYear, from: date)
    return (year, week)
}

Ruby

require 'date'

# 返回 [ISO 年份, ISO 周数]
def get_iso_week(d)
  [d.cwyear, d.cweek]
end

常见陷阱与规避

测试建议(覆盖边界)

结论