当前位置: 首页 > 知识库问答 >
问题:

日期格式为非常旧的日期提供了奇怪的时区

单嘉泽
2023-03-14

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

  • 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。为什么会出现这个奇怪的时区?

共有1个答案

於乐
2023-03-14

过去,每个地区都通过观察日落和日出的时间来保持自己的当地平均时间。这意味着每个城镇/城市的当地时间与格林威治时间的偏移量不是一个很好的整数,例如17分钟。直到人们发明了有时刻表的火车,这个问题才算大。大约在19世纪,世界各地的国家标准化了当地时间,这就是为什么我们有很好的整数偏移,比如1小时(大部分时间)。

所以在1000年,就我们所知,你所在的时区欧洲/布鲁塞尔实际上比格林威治早了17分钟。这段历史记录在IANA tz数据库中,这就是时区查询。这就是为什么你得到了00:17。

有趣的是,当我问时区在1000秒左右距离格林威治标准时间有多少秒时,它说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()));
 类似资料:
  • 问题内容: 我正在使用Python访问某些Web服务的移动API,响应中包含以下奇怪的日期表示法:这应该是2014年9月1日。 我不确定这是哪种格式,但是我想将其转换为可读的格式,即a或a或Unix时间。 有人可以帮我吗? 问题答案: 时间字符串看起来像[Datetime的OData版本2JSON详细格式,可以在旧的ASP.NET或WCF应用程序中看到: “ / Date( [“ +” |“-”

  • 我在 Android 中面临日期解析的真正问题。我通过 JSON 接收一个日期,日期为 dd/MM/yyyy HH:mm z 格式,我所需要的只是获取“本地化”的小时和分钟并将其显示在我的应用程序中。使用我的代码,每台设备上一切正常,但我的客户报告说,他们在使用索尼XPERIA设备时无法看到应用程序中的时间。他们还告诉我,他们有一个无法显示时间的XPeria设备,然后他们扎根它,一切都开始正常工作

  • 该表包含每个月的内容:第一天、最后一天以及这两天之间的天数。 预期成果: /** 英国标准时间2016年9月30日(星期五)00:00:00-英国标准时间2016年10月29日(星期六)23:59:59 2016年10月30日太阳00:00:00英国标准时间2016年11月29日星期二23:59:59 GMT 2016-31 格林尼治时间2016年11月30日00:00:00-格林尼治时间2016

  • 我尝试解析时间格式化字符串,现在当我解析字符串“2014-01-07 95:25:37”时,它返回一个日期,而不是抛出ParseException。谁知道如何让它抛出异常。谢谢乔治。 输出:

  • 下表显示可用于为图表中的日期时间字段创建用户定义的数据格式的说明符。 说明符 描述 D 将日显示为不带前导零的数字(1-31)。 DD 将日显示为带前导零的数字(01-31)。 M 将月份显示为不带前导零的数字(1-12)。 MM 将月份显示为带前导零的数字(01-12)。 MMM 将月份显示为缩写形式(Jan-Dec)。 MMMM 将月份显示为完整月份名(January-December)。 Y

  • 下表显示可用于为图表中的日期时间字段创建用户定义的数据格式的说明符。 说明符 描述 D 将日显示为不带前导零的数字(1-31)。 DD 将日显示为带前导零的数字(01-31)。 M 将月份显示为不带前导零的数字(1-12)。 MM 将月份显示为带前导零的数字(01-12)。 MMM 将月份显示为缩写形式(Jan-Dec)。 MMMM 将月份显示为完整月份名(January-December)。 Y