Рассмотрим следующий код:
import UIKit
let date = Date()
guard let nycTimeZone = TimeZone(abbreviation: "EST"),
let nzTimeZone = TimeZone(abbreviation: "NZDT") else {
fatalError()
}
var nycCalendar = Calendar(identifier: .gregorian)
nycCalendar.timeZone = nycTimeZone
var nzCalendar = Calendar(identifier: .gregorian)
nzCalendar.timeZone = nzTimeZone
let now = Date()
let nycDayOfEra = nycCalendar.ordinality(of: .day, in: .era, for: now)
let nycDayOfYear = nycCalendar.ordinality(of: .day, in: .year, for: now)
var nzDayOfEra = nzCalendar.ordinality(of: .day, in: .era, for: now)
var nzDayOfYear = nzCalendar.ordinality(of: .day, in: .year, for: now)
Когда я пишу это, время Нью-Йорка и время Окленда Новой Зеландии показывают разные дни. Это тот случай, который меня интересует.
В приведенном выше коде результаты для nycDayOfYear и nzDayOfYear различаются (на момент написания я получил nycDayOfYear = 42 и nzDayOfYear = 43).
Это соответствует ожиданиям и желаемым. (Я работал, чтобы ответить на вопрос: «Как мне рассчитать количество дней разницы в двух датах, оцениваемых в разных часовых поясах?».)
Однако потребовалась бы куча беспорядочных корректировок, чтобы произвести вышеуказанный расчет дня года и вычислить количество дней разницы между этими местными датами, когда они охватывают границы года.
Поэтому я попытался произвести расчеты, используя ordinality(of: .day, in: .era, for: date)
.
Однако вычисления, основанные на календарной эре, дают одно и то же значение независимо от часового пояса календаря, используемого для вычисления.
Это почему?
Что было бы более простым способом рассчитать разницу в количестве календарных дней между двумя датами, ПРИ ВЫРАЖЕНИИ В РАЗНЫХ МЕСТНЫХ ЧАСОВЫХ ПОЯСАХ? Как я уже сказал, мой код, который вычисляет день года, потребует добавления дополнительной логики для обработки дат, которые охватывают границы календарного года.
Обратите внимание, что это другой вопрос, чем «Сколько дней разница между двумя датами». В моем вопросе я хочу, чтобы обе даты были выражены в разных часовых поясах, и меня интересует разница в календарной дате каждого из этих значений даты.
DateComponents(calendar: ..., era: 1).date!
возвращает 0001-01-01 04:56:02 +0000 для календаря Нью-Йорка и 0000-12-31 12:20:56 +0000 для календаря Новой Зеландии, т.е. часовые пояса. - Моя догадка заключается в том, что количество дней в эре не дает разумного результата. - person Martin R   schedule 11.02.2017NSDate
часто отличается на 1 день в часовых поясах Нью-Йорка и Новой Зеландии. См. Мой ответ на часть вопроса ниже. - person Duncan C   schedule 11.02.2017