DateForMatter为非常古老的日期提供了奇怪的时区 [英] DateFormatter gives weird timezone for very old dates

查看:49
本文介绍了DateForMatter为非常古老的日期提供了奇怪的时区的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对于我的一个客户,我正在处理非常古老的日期,例如:

  • 0572-06-17
  • 1000-06-17

当我将字符串转换为日期时,它有一个奇怪的时区。 示例:

extension String {
    func yearMonthDayDate() -> Date? {
        return DateFormatter.yearMonthDayFormatter.date(from: self)
    }
}

extension DateFormatter {
    static let yearMonthDayFormatter: DateFormatter = {
        let dateFormatter = DateFormatter()
        dateFormatter.timeZone = .current
        dateFormatter.dateFormat = "yyyy-MM-dd"
        dateFormatter.locale = .current
        return dateFormatter
    }()
}

extension Date {
    func zonedDate() -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.timeZone = .current
        dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssXXX"
        dateFormatter.locale = .current
        return dateFormatter.string(from: self)
    }
}
print("1000-06-17".yearMonthDayDate()!.zonedDate())
1000-06-17T00:00:00+00:17
如您所见,时区为+00:17。 为什么会出现这个奇怪的时区?

推荐答案

过去,每个地方都是通过观测日落和日出的时间来保存自己的local mean time。这意味着每个城镇/城市的当地时间与格林威治的偏差不是一个很好的整数,例如+17分钟。这并不是一个大问题,直到人们发明了有时刻表的火车。在19世纪左右,世界各地的国家standardised他们的当地时间,这就是为什么我们有很好的整数偏移量,比如+1小时(大多数时间)。

就我们所知,在公元1000年,您的时区Europe/Brussels比格林威治早17分钟。这段历史记录在IANAtz数据库中,这是TimeZone查询的内容。这就是您获得+00:17的原因。

有趣的是,当我问TimeZone距离格林尼治标准时间大约1000s有多少秒时,它说0:

let date = Date(timeIntervalSinceNow: 86400 * 365 * -1000)
// this is 0
TimeZone(identifier: "Europe/Brussels")!.secondsFromGMT(for: date)

它可能将实际秒数四舍五入。但Java可以告诉您实际的答案:

// prints +00:17:30
System.out.println(ZoneId.of("Europe/Brussels")
    .getRules().getOffset(LocalDate.of(1000, 1, 1).atStartOfDay()));

这篇关于DateForMatter为非常古老的日期提供了奇怪的时区的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆