Java / Python / PHP / Golang / Swift / Ruby 如何判断周六和周日周末

判断是否为周末看似简单,易错点在于各语言/库对“星期”的数字编码不同。请先确认所用 API 的编码,再实现判断逻辑。

对比表(星期编码)

语言/库常用 API周六周日
Gotime.Time.Weekday()60
Pythondate.weekday()56
Python(ISO)date.isoweekday()67
Java 8+LocalDate.getDayOfWeek().getValue()67
PHPDateTime::format('N')67
PHP(备选)date('w')60
SwiftCalendar.isDateInWeekend(_:)--
Swift(备选)component(.weekday, ...)71
RubyDate#wday60

提示:

  • Swift 推荐 isDateInWeekend,可自动适配地区性周末定义;如需固定“周六/周日”,可用 .weekday 按上表判断(注意:.weekday 的数值依赖所用 Calendar)。
  • PHP 同时提供 N(ISO-8601)与 w 两套编码,二选一,勿混用。

实现代码(可直接复用)

Go

package weekend

import "time"

// 周日=0,周六=6
func IsWeekend(t time.Time) bool {
    wd := t.Weekday()
    return wd == time.Saturday || wd == time.Sunday
}

Python

from datetime import date

# 周一=0,周日=6
def is_weekend(d: date) -> bool:
    return d.weekday() >= 5  # 5=周六, 6=周日

Java(java.time)

import java.time.DayOfWeek;
import java.time.LocalDate;

public final class Weekend {
    private Weekend() {}

    public static boolean isWeekend(LocalDate d) {
        DayOfWeek day = d.getDayOfWeek();
        return day == DayOfWeek.SATURDAY || day == DayOfWeek.SUNDAY;
    }
}

PHP

<?php
// 1=周一 … 7=周日
function is_weekend(DateTimeInterface $dt): bool {
    return (int)$dt->format('N') >= 6; // 6=周六, 7=周日
}

Swift

import Foundation

// 根据 Calendar/Locale 自动识别周末(多数地区为周六/周日)
func isWeekend(_ date: Date, calendar: Calendar = .current) -> Bool {
    calendar.isDateInWeekend(date)
}

Ruby

require 'date'

# 周日=0,周六=6
def weekend?(d)
  w = d.wday
  w == 0 || w == 6
end

注意事项

  • 时区:同一时刻在不同时区可能对应不同“本地日期”,进而影响周末判断。请显式指定并统一时区。
  • 本地化:部分地区的“周末”不是周六/周日(如周五/周六)。若面向国际用户,周末定义应可配置。
  • 测试:使用固定日期断言(如 2025-01-04 为周六),避免 now()/today() 带来的不确定性;覆盖跨时区、边界情况。

结论

先确认 API 的星期编码或直接使用更安全的“内置周末”判断(如 Swift 的 isDateInWeekend),再以独立、可测试的函数封装逻辑,并显式处理时区/本地化,即可得到一致、可预测的结果。