【问题标题】:Why does `ordinality(of: .day, in: .era, for: date)` give the same result for 2 dates in different time zones?为什么 `ordinality(of: .day, in: .era, for: date)` 在不同时区的 2 个日期给出相同的结果?
【发布时间】:2017-06-29 22:46:09
【问题描述】:

考虑以下代码:

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

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

这是为什么呢?

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

请注意,这是一个不同于“两个日期之间相差多少天”的问题。在我的问题中,我希望两个日期都以不同的本地时区表示,并且我对每个日期值的日历日期的差异感兴趣。

【问题讨论】:

  • “这将需要一堆混乱的调整”等等 - 为什么会这样?计算出最初以不同时区表示的两个日期之间的差异很容易,因为 NSDate 本身,无论 原始 时区如何,都是绝对的。
  • "在不同的本地时区表示时两个日期之间的日历天数差异"是什么意思? NSDate 是一个绝对时间点(正如马特刚才所说)。 “两个日期之间的天数”是指特定日历和时区。
  • “长”间隔上的日历计算可能会产生意想不到的结果,请参阅stackoverflow.com/q/41860009/1187415 以获取另一个示例。在您的情况下,DateComponents(calendar: ..., era: 1).date! 为纽约日历返回“0001-01-01 04:56:02 +0000”,为新西兰日历返回“0000-12-31 12:20:56 +0000”,即差异是不仅仅是时区的差异。 – 我的猜测是“时代的天数”没有给出合理的结果。
  • Matt,仔细阅读问题描述。目标是计算在不同时区表示的 2 个日期之间的日历天数差异。例如,相同的NSDate 在纽约和新西兰时区通常相差 1 天。请参阅下面我对问题“如何做”部分的回答。
  • Martin,我不知道如何用清晰的方式表达这个问题。我要解决的问题是如何捕捉 NSDate 可以根据时区产生不同的 mm/dd/yyyy 结果这一事实,并计算“本地 mm/dd/yyyy 术语”中 2 个 NSDate 之间的差异.

标签: ios swift nscalendar


【解决方案1】:

Martin 关于在 long 间隔内的日历计算给出意想不到的结果的评论是一个很好的答案,可以解释为什么它不起作用。

我确实提出了计算在特定时区表示的 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:),它可以让您计算两个DateComponents 值之间的差异,无论您想使用什么单位来比较它们。 (天,在这种情况下)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多