为什么`normalality(of .day,in:.era,for:date)`给出不同时区的2个日期相同的结果?

时间:2017-02-11 17:18:51

标签: ios swift nscalendar

请考虑以下代码:

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)进行计算。

但是,无论用于进行计算的日历的时区如何,基于日历时代的计算都会给出相同的值。

为什么?

计算两个日期之间的日历日差异的简单方法是什么?在不同的本地时区显示?就像我说的那样,我计算一年中某一天的代码需要额外的逻辑来处理跨越日历年边界的日期。

请注意,这是一个与&#34不同的问题; 2个日期和#34;之间存在多少天的差异。在我的问题中,我希望两个日期都在不同的当地时区表达,并且我对每个日期值的日历日期的差异感兴趣。

1 个答案:

答案 0 :(得分:0)

Martin关于间隔的日历计算的评论给出了意想不到的结果,这与其为什么不起作用一样好。

我确实想出了一些代码,用于计算在特定时区表示的2个日期之间日历日期值的所需差异:

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 nycDateComponents = nycCalendar.dateComponents([.month, .day, .year], from: now)
let nzDateComponents = nzCalendar.dateComponents([.month, .day, .year], from: now)

let difference = Calendar.current.dateComponents([.day],
  from: nycDateComponents,
    to: nzDateComponents)

let daysDifference = difference.days

首先,我使用设置为特定时区的日历将2个日期转换为月/日/年DateComponents值。

然后我使用日历函数dateComponents(_:from:to:),它可以计算2个DateComponents值之间的差异,以您想用来比较它们的单位。 (天,在这种情况下)