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

如何在Swift中通过代码获取日期时分并将其设置为00:00

问题根源
  • 你调用print(Date)时,Swift会默认将Date格式化为GMT零时区的时间字符串输出,所以你看到的是2021-10-25 06:00:00 +000
  • 而Calendar.current默认使用设备当前的本地时区,你设备当前时区应该是GMT-6,所以GMT时区的6点对应你本地时区的0点,这就是你取components.hour得到0的原因,属于时区不一致导致的正常现象,不是代码语法错误。
修复方案

你不需要手动写死时区偏移,只要统一用GMT时区做日期分量运算即可,修改后的代码如下:

func AdjustDateTime(vooDate: Date) -> Date {
    // 明确使用GMT时区做运算,和打印Date的默认输出时区对齐
    var calendar = Calendar(identifier: .gregorian)
    calendar.timeZone = TimeZone(secondsFromGMT: 0)!
    
    print("date")
    print(vooDate)
    let components = calendar.dateComponents([.year, .month, .day, .hour, .minute], from: vooDate)
    let year = components.year!
    let month = components.month!
    let day = components.day!
    
    // 直接构造GMT时区下的下一天0点,不需要手动设置负的小时偏移
    var comps = DateComponents()
    comps.timeZone = calendar.timeZone
    comps.year = year
    comps.month = month
    comps.day = day + 1
    comps.hour = 0
    comps.minute = 0
    
    let returnDate = calendar.date(from: comps)!
    print("Return Date")
    print(returnDate)
    return returnDate
}
补充说明
  • 如果你实际需求不是基于GMT时区运算,而是要基于用户本地时区取日期分量,只要把上面代码里的calendar.timeZone赋值逻辑删掉,用默认的Calendar.current即可,不需要手动硬编码时差数值。
  • 如果你需要动态获取当前时区和GMT的偏移量,可以用TimeZone.current.secondsFromGMT(for: vooDate)获取偏移秒数,再转换为小时即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:15:07