Swift中Calendar.current.nextDate时区不生效问题问询
问题分析与解决方案:Calendar.nextDate 不遵循 DateComponents 时区的原因
这个问题的核心在于:Calendar实例本身的时区才是日期匹配逻辑的基准,DateComponents里设置的时区在这里并不会被nextDate方法采用。
你用的Calendar.current是设备的本地时区(比如你这里的EST),当调用nextDate时,它会基于这个本地时区去寻找“小时为18”的下一个时间——所以得到的是EST时区的18点,对应UTC的23点,这和你的预期不符。
而DateComponents里的时区参数,只有在把组件转换为Date对象时(比如用calendar.date(from: dateComponents))才会生效;但在nextDate这类基于现有日期匹配组件的方法中,Calendar自身的时区才是处理逻辑的上下文,DateComponents里的时区会被忽略。
修正后的代码
要得到UTC时区18点的下一个未来日期,你需要创建一个使用UTC时区的Calendar实例,再用它来调用nextDate:
// 创建基于UTC时区的公历实例 let utcCalendar = Calendar(identifier: .gregorian) utcCalendar.timeZone = TimeZone(abbreviation: "GMT")! // 只需要定义要匹配的小时组件即可,时区由Calendar控制 let dateComponents = DateComponents(hour: 18) let date = utcCalendar.nextDate(after: Date(), matching: dateComponents, matchingPolicy: .nextTime) print(date) // 现在会输出UTC时间的18点,例如:2019-02-09 18:00:00 +0000
补充说明
记住一个关键点:所有Calendar类的日期计算方法(比如nextDate、date(byAdding:to:)等),都是基于该Calendar实例设置的时区来运行的。DateComponents只是用来描述“要匹配的组件值”,而这些值的时区解释权完全在Calendar手上。
内容的提问来源于stack exchange,提问作者Burgan
相关产品推荐
相关产品推荐

