1

我拼命想了解 swift 的 DatePicker。我需要选择从 Julian Day 0 (11/24/4714 BCE) 到未来日期的日期。当我从 DatePicker 中提取 DateComponents 时,它们似乎不是一个“预测”的公历。例如,通过选择 3/1/300 AD(或 CE),月份和日期为 2/29。这似乎与儒略历一致,这是我无法在 DatePicker 的日历设置为 iso8601 或公历时选择的日期。我熟悉公历的采用日期,实际上这就是差异开始的地方。但是为什么它不计算预产期,或者我误解了这一点。提取这些组件对于计算各种数量(例如儒略日)或从一个日历转换为另一个日历是必要的。

---编辑显示代码 -----

@IBAction func calculate(_ sender: Any) {
    var mycal = Calendar(identifier: .iso8601)
    //var mycal = Calendar(identifier: .gregorian)
    let picked_date:Date = datePicker.dateValue
    let formatter1 = DateFormatter()
    formatter1.locale = Locale(identifier: "en_US_POSIX")
    formatter1.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
    let picked_format = formatter1.string(from: picked_date)
    //print("picked_format: \(picked_format)")
    let format_date = formatter1.date(from: picked_format)
    var tz: String { return TimeZone.current.identifier }
    let myzone = UTC.state == NSOnState ? tz : "GMT"
    //let era = AD.state == NSOnState ? 1 : 0
    mycal.timeZone = TimeZone(identifier: myzone)!
    var comps = mycal.dateComponents([.year,
                                    .month,
                                    .day,
                                    .hour,
                                    .minute,
                                    .second,
                                    //.era,
                                    //.nanosecond,
                                    .timeZone],
                                from: format_date!)
    print(comps.month!)
    print(comps.day!)
4

1 回答 1

0

底线:D​​atePicker 中显示的内容与其生成的日期对象(即 YEAR、MONTH 和 DAY)的“元素”之间的差异完全是由于我在编写代码时犯了一个粗心的错误:未能确保所有处理日期的对象被指定给同一个日历。最初,我的 DateFormatter 和 DateComponents 对象被设置为“.iso8601”,并且未能为 DatePicker 指定日历,将其默认为我的语言环境,这意味着“.gregorian”。这在 1582 年 10 月 15 日之前的日期中产生了 10 天的差异。此外:使用公历的 DatePicker 将允许您选择 1582 年 10 月 5 日至 1582 年 10 月 14 日(含)之间的日期,正如我所期望的那样日历。使用 ISO 日历的 DatePicker 不允许此范围内的日期。

不过,有一些警告。Apple 的文档和 ISO 标准本身让我相信 ISO 日历是基于预测的公历。事实证明这是不真实的。您可以为自己重复以下操作:创建一个 DatePicker 指定 ISO 日历,它将允许您选择公历中不存在的日期,即 1500、1400、1300、1100、1000 等年份的闰年. 这更符合 ISO 日历,其行为类似于采用日期之前的儒略历。事实上,随着年份数字的减少,日期差异开始缩小,因为 ISO 日历将这些年份计为闰年。从公元 200 年 3 月 1 日到 300 年 2 月 28 日,该错误变为零,正如人们对儒略历与预测公历的预期一样。我不 不知道我是否误解了 ISO 日历的行为方式,或者这是否是一个错误。感谢 Willeke 引导我找到正确的解决方案!

于 2017-05-29T17:57:34.773 回答