NSCalendar не соответствует времени по Гринвичу

Когда я вычисляю начало дня, получается разница во времени в один час. Почему не исправлено GMT+1?

let cal = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
cal.timeZone = NSTimeZone.localTimeZone()

let startOfToday = cal.startOfDayForDate(NSDate())

print(NSTimeZone.localTimeZone())
print(startOfToday)

Выход:

"Local Time Zone (Europe/Amsterdam (GMT+1) offset 3600)\n"
"2016-01-14 23:00:00 +0000\n"

1 ответ

Решение

Ваш код должен работать нормально, вам не нужно беспокоиться о часовых поясах. Как уже упоминалось Мартином Р. "NSDate является абсолютным моментом времени и не имеет часового пояса". Если вам действительно нужно использовать время UTC, вы можете установить для свойства календаря значение UTC, чтобы получить startOfDay или полдень по времени UTC для любой даты следующим образом:

extension Calendar {
    static let utc: Calendar  = {
        var calendar = Calendar.current
        calendar.timeZone = TimeZone(identifier: "UTC")!
        return calendar
    }()
    static let localTime: Calendar  = {
        var calendar = Calendar.current
        calendar.timeZone = .current
        return calendar
    }()
}

extension Date {
    var noon: Date {
        return Calendar.localTime.date(bySettingHour: 12, minute: 0, second: 0, of: self)!
    }
    var startOfDay: Date {
        return Calendar.localTime.startOfDay(for: self)
    }
    var noonAtUTC: Date {
        return Calendar.utc.date(bySettingHour: 12, minute: 0, second: 0, of: self)!
    }
    var startOfDayAtUTC: Date {
        return Calendar.utc.startOfDay(for: self)
    }
}

print(Date().noon)               // "2018-04-30 15:00:00 +0000\n"
print(Date().startOfDay)         // "2018-04-30 03:00:00 +0000\n"

print(Date().noonAtUTC)          // "2018-04-30 12:00:00 +0000\n"
print(Date().startOfDayAtUTC)    // "2018-04-30 00:00:00 +0000\n"
Другие вопросы по тегам