gpt4 book ai didi

Swift - 打印时来自组件的日期不正确。日期有 2 个值?

转载 作者:搜寻专家 更新时间:2023-11-01 07:06:36 27 4
gpt4 key购买 nike

我正在尝试将一天中的时间存储在日期中:

let calendar = NSCalendar.init(identifier: .gregorian)
let components = NSDateComponents()
components.hour = 7
components.minute = 0

var newDate = calendar?.date(from: components as DateComponents)!

print(newDate!)

但是,当我尝试打印或以其他方式使用该值时,这会产生一些奇怪的结果。这是结果的 Swift Playground:

Strange date results

newDate 如何同时为上午 7:00 和上午 11:56?

最佳答案

您没有指定时区(通过设置 componentscalendartimeZone 属性)。因此,系统使用您本地的时区将 components 转换为日期。

playground 系统使用您本地的时区将 newDate 转换为字符串“Jan 1, 1 at 7:00 AM”。 ( Playground 系统具有用于显示 Date 对象的特殊情况代码。特殊情况代码使用您本地的时区。)

print 函数使用 UTC 时区将 newDate 转换为字符串“0001-01-01 11:56:02 +0000”。 (print 函数使用 CustomStringConvertible 协议(protocol)。DateCustomStringConvertible 实现使用 UTC 时区。)

我推断您本地的时区是美国/东部时间,也称为America/New_York:

import Foundation

var calendar = Calendar(identifier: .gregorian)
let components = NSDateComponents()
components.hour = 7
components.minute = 0

for timeZoneIdentifier in TimeZone.knownTimeZoneIdentifiers {
calendar.timeZone = TimeZone(identifier: timeZoneIdentifier)!
let date = calendar.date(from: components as DateComponents)!
let dateString = "\(date)"
if dateString == "0001-01-01 11:56:02 +0000" {
print("\(timeZoneIdentifier) \(date)")
}
}
// Only one line of output: America/New_York 0001-01-01 11:56:02 +0000

那么为什么 UTC 中有奇怪的分钟和秒? Because at noon on November 18, 1883, the US and Canada railway companies began using a new, standard time system ,这是我们今天仍在使用的时间系统。观察:

import Foundation

let formatter = ISO8601DateFormatter()

var calendar = Calendar(identifier: .gregorian)
calendar.timeZone = TimeZone(identifier: "America/New_York")!
let components = NSDateComponents()

components.year = 1883
components.month = 11
components.day = 18

components.hour = 11
print(formatter.string(from: calendar.date(from: components as DateComponents)!))
// prints 1883-11-18T15:56:02Z

components.hour = 12
print(formatter.string(from: calendar.date(from: components as DateComponents)!))
// prints 1883-11-18T17:00:00Z

中午之前,与 UTC 时间的时差是 4:56:02。

在标准铁路时间出现之前,我们通常根据本地正午(太阳在天空中最高且阴影恰好指向北方或南方,或者如果太阳直接在头顶上则完全消失的时刻)来定义本地时间。

如果我们查看 the tz Time Zone Database 中 America/New_York 的定义| ,我们发现:

# From Paul Eggert (2014-09-06):
# Monthly Notices of the Royal Astronomical Society 44, 4 (1884-02-08), 208
# says that New York City Hall time was 3 minutes 58.4 seconds fast of
# Eastern time (i.e., -4:56:01.6) just before the 1883 switch. Round to the
# nearest second.

再往下一点:

Zone America/New_York   -4:56:02 -  LMT 1883 Nov 18 12:03:58

这解释了我们在 1883 年 11 月 18 日中午之前看到的差异。

关于Swift - 打印时来自组件的日期不正确。日期有 2 个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47686895/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com