首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试理解NSDatePicker

尝试理解NSDatePicker
EN

Stack Overflow用户
提问于 2017-05-24 10:38:23
回答 1查看 320关注 0票数 1

我拼命地想要理解swift的DatePicker。我需要选择从Julian Day 0(公元前11/24/4714)到将来的日期。当我从DatePicker中提取DateComponents时,它们看起来不像是“先验的”公历。例如,通过选择3/1/300 AD (或CE),月和日为2/29。这似乎与儒略历一致,我不能选择日期选择器的日历设置为iso8601或公历的日期。我熟悉采用公历的日期,实际上,这就是差异开始的地方。但是为什么它不计算服用安慰剂的日期,或者我误解了这一点。提取这些分量对于计算各种数量是必要的,例如儒略日或从一个日历转换到另一个日历。即使是在哪里找到信息的建议也会很受欢迎。

-编辑以显示代码

代码语言:javascript
复制
@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!)
EN

回答 1

Stack Overflow用户

发布于 2017-05-30 01:57:35

结论: DatePicker中显示的内容与它生成的日期对象(即年、月和日)的“元素”之间的差异完全是由我在编写代码时犯下的一个粗心错误造成的:未能确保所有处理日期的对象都指定到相同的日历中。最初,我的DateFormatter和DateComponents对象被设置为".iso8601“,没有为DatePicker指定日历,它默认为我的语言环境,这意味着".gregorian”。这在1582年10月15日之前的日期中产生了10天的差异。另外:使用公历的DatePicker将允许您选择从1582年10月5日到1582年10月14日(包括1582年)的日期,就像我期望的那样。使用国际标准化组织日历的DatePicker不允许此范围内的日期。从1582年10月15日下降一天将导致DatePicker显示1582年10月4号...这不是我所期望的结果,如果它是基于前驱避剂格里高利。

不过,还有一些需要注意的地方。苹果的文档和ISO标准本身让我相信ISO日历是基于公历的。事实证明这是不正确的。您可以为自己重复以下操作:创建一个指定国际标准化组织日历的DatePicker,它将允许您选择在公历中不存在的日期,即用于1500、1400、1300、1100、1000等年份的闰年。事实上,随着年份的减少,日期差异开始缩小,因为ISO日历将这些年份算作闰年。从公元200年3月1日到公元300年2月28日,误差变为零,这与人们对儒略历与公历的预期完全相同。我不知道我是否误解了ISO日历应该如何运行,或者这是否是一个bug。感谢Willeke带领我找到了正确的解决方案!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44148030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档