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

macOS Date()获取当月1号异常:返回下月1号求助

问题原因与解决思路

问题根源

你使用的calendar.date(bySetting: .day, value: 1, of: self)方法存在容易忽略的行为:它会保留原日期的时分秒等时间组件,如果当前日期的时间部分在当月1号的同一时刻因时区(比如夏令时切换)或日历规则无法存在时,日历会自动将日期滚动到下一个有效日期,也就是下月1号。部分时区的偏移也可能导致看似正确的计算出现偏差。

可靠解决方案

更稳妥的方式是先提取当前日期的年、月组件,再明确构建当月1号的日期(同时建议将时分秒设为0,避免时间部分干扰):

import Foundation
extension Date {
    func firstOfMonth() -> Date {
        let calendar = Calendar.current
        let components = calendar.dateComponents([.year, .month], from: self)
        guard let firstDay = calendar.date(from: components) else {
            return Date()
        }
        // 可选:将时间设置为当天0点,避免时分秒影响
        return calendar.startOfDay(for: firstDay)
    }
}

补充说明

  • 先提取year和month组件,再用date(from:)生成日期,能确保得到的是当月1号的起始时刻,不会出现意外滚动。
  • startOfDay(for:)方法可以将时间部分统一调整为当天的0点,进一步避免时区或时间组件带来的计算误差。

内容的提问来源于stack exchange,提问作者paulrbarnard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:33:15