如何将90天前日期的时间清零为00:00:00 +0000?
问题分析与解决方案
问题根源
- 时区干扰:你使用的
Calendar.current是本地时区日历,设置的00:00:00是本地时区的午夜,转换为UTC时区就会显示为前一天的23:00:00 +0000(比如本地时区为UTC+1时)。 - 日期计算偏差:原代码先取当前年月生成当月第一天的日期,再往前推90天,这不是从当天开始计算的90天前日期,导致结果偏差。
修正代码
要得到UTC时区的90天前00:00:00时间,需使用UTC日历来处理:
print("LAST NINETY DAYS") // 创建UTC时区的日历实例 let utcCalendar = Calendar(identifier: .gregorian) utcCalendar.timeZone = TimeZone(identifier: "UTC")! // 获取当前日期的UTC午夜时间(00:00:00 +0000) var todayUtcComponents = utcCalendar.dateComponents([.year, .month, .day], from: Date()) todayUtcComponents.hour = 0 todayUtcComponents.minute = 0 todayUtcComponents.second = 0 let todayUtcMidnight = utcCalendar.date(from: todayUtcComponents)! // 计算90天前的UTC午夜时间 let ninetyDaysAgoUtcMidnight = utcCalendar.date(byAdding: .day, value: -90, to: todayUtcMidnight) ?? Date() print(ninetyDaysAgoUtcMidnight) print(Date()) firstAndLastDateObj.firstDate = ninetyDaysAgoUtcMidnight firstAndLastDateObj.lastDate = Date()
代码说明
- 用UTC日历处理日期,确保时间设置和计算都基于UTC时区,避免本地时区转换导致的时间偏移。
- 先获取当天的UTC午夜时间,再往前推90天,保证日期计算的准确性。
内容的提问来源于stack exchange,提问作者Author
相关产品推荐
相关产品推荐

