如何在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
相关产品推荐
相关产品推荐

