在整个应用程序中,我使用Date对象,当我NSLog的值时,它显示给我。
2020-05-24 22:00:00 +0000
我认为当地的意思是25日(-1为夏季,-1为时区)。我想做一些日历日期的比较。
var calendar = Calendar(identifier: .gregorian)
calendar.timeZone = TimeZone(identifier: "UTC")!
// In order to have start on Monday
calendar.firstWeekday = 2
使用这个日历,假设我想得到当前一周的开始日期。
extension Date
{
var startOfWeek: Date {
return Calendar.gregorian.date(from: Calendar.gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self))!
}
}
如果我用NSLog:
Date().startOfWeek
它将显示:
2020-05-25 00:00:00 +0000
如果我在日历上禁用timeZone行,它就会显示我。
2020-05-24 22:00:00 +0000
我一直以为第二个才是正确的UTC版本。难道我说错了吗?因为我以为所有的核心数据日期,所有的日期都在第2个版本。简而言之:如果我把日历设置为UTC,我的日期比较就会出错。如果我不这样做,他们是好的。而且所有的时间日期都是UTC的。
你错了,因为CoreData的日期不受时区的影响。日期就是日期。把它们看作是数值。当你把这个值翻译成日期和时间时,只有在这个时候,才会应用TimeZone。
在你的例子中,一切都很正确。对于时区为UTC的日历,2020-05-25 00:00:00 +0000是一周的开始。如果您使用其他时区值(例如来自Locale的默认值),那么您的一周开始于2020-05-24 22:00:00 +0000。这意味着在你的时区,时间是2020-05-25 00:00:00。