Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么“普通性(of:.day,in:.era,for:date)”对不同时区的两个日期给出相同的结果?_Ios_Swift_Nscalendar - Fatal编程技术网

Ios 为什么“普通性(of:.day,in:.era,for:date)”对不同时区的两个日期给出相同的结果?

Ios 为什么“普通性(of:.day,in:.era,for:date)”对不同时区的两个日期给出相同的结果?,ios,swift,nscalendar,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 = nycT

考虑以下代码:

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)

这是意料之中的,也是人们所期望的。(我正在努力回答一个“如何计算在不同时区评估的两个日期的差异天数?”的问题。)


然而,需要进行一系列杂乱的调整,才能进行上述的年度计算,并计算出跨越年度边界的当地日期之间的差异天数

因此,我尝试使用
序数(of:.day,in:.era,for:date)
进行计算

但是,基于日历纪元的计算会给出相同的值,而与用于进行计算的日历时区无关

为什么呢

当以不同的本地时区表示时,计算两个日期之间的日历日数的更简单方法是什么?正如我所说,我计算一年中某一天的代码需要添加额外的逻辑来处理跨越日历年边界的日期


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

马丁关于在长的时间间隔内进行日历计算会产生意想不到的结果的评论是一个很好的答案,就像任何关于为什么它不起作用的回答一样

我确实提出了计算特定时区中表示的两个日期之间日历日期值所需差异的代码:

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
首先,我使用设置为特定时区的日历将这两个日期转换为月/日/年
DateComponents


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

“这将需要一系列混乱的调整”等等——为什么?计算最初在不同时区表示的两个日期之间的差异很容易,因为NSDate本身是绝对的,无论原始时区是什么。“在不同的本地时区表示的两个日期之间的日历天数差异”是什么意思?NSDate是一个绝对的时间点(正如matt刚才所说)。“两个日期之间的天数”指的是特定的日历和时区。“长”时间间隔内的日历计算可能会产生意外结果,请参见另一个示例。在您的例子中,
DateComponents(日历:…,纪元:1).date对于纽约日历返回“0001-01-01 04:56:02+0000”,对于新西兰日历返回“0000-12-31 12:20:56+0000”,即差异不仅仅是时区的差异我的猜测是“时代的天数”没有给出合理的结果。马特,仔细阅读问题的描述。目标是计算出两个日期在不同时区表示时的日历天数差异。例如,在纽约和新西兰时区,相同的日期通常相差一天。请看我对下面问题“如何”部分的回答。马丁,我不知道如何用一种清晰的方式表达这个问题。我试图解决的问题是,如何捕捉一个NSDate可以根据时区产生不同的mm/dd/yyyy结果这一事实,并以“本地mm/dd/yyyy术语”计算两个NSDate之间的差异。