Ios 将字符串转换为日期时时区已更改
当我将日期(字符串形式)更改为日期形式时,时区将IST更改为UTC。因此,我没有收到通知 我的代码是:Ios 将字符串转换为日期时时区已更改,ios,swift,Ios,Swift,当我将日期(字符串形式)更改为日期形式时,时区将IST更改为UTC。因此,我没有收到通知 我的代码是: @IBAction func datePickerDidSelectNewDate(_ sender: UIDatePicker) { let selectedDate = sender.date let dateStr = Date().currentTimeZoneDate(date: selectedDate as NSDate) let date = dateF
@IBAction func datePickerDidSelectNewDate(_ sender: UIDatePicker) {
let selectedDate = sender.date
let dateStr = Date().currentTimeZoneDate(date: selectedDate as NSDate)
let date = dateFormatter.date(from: dateStr)
let delegate = UIApplication.shared.delegate as? AppDelegate
delegate?.scheduleNotification(at: date!)
}
在我的代码中,我得到了
selectedDate
在UTC时区。因此我将其转换为currentTimeZone。但是当我将字符串形式更改为Date时,意味着dateStr
转换为Date
它将再次转换为UTC时区。Swift的Date
类型(以及它的目标-CNSDate
)没有任何时区的概念。这只是一个简单的时间戳。这意味着,如果将时区设置为UIDatePicker,则可以使用该时区中的日期,而无需对其进行转换
更多说明:在调试器控制台中
po date
时,调试器只需选择UTC
时区作为打印日期的表示。它的行为与日期实例无关。Swift的Date
类型(以及它的Objective-CNSDate
)本身没有任何时区概念。这只是一个简单的时间戳。这意味着,如果将时区设置为UIDatePicker,则可以使用该时区中的日期,而无需对其进行转换
更多说明:在调试器控制台中
po date
时,调试器只需选择UTC
时区作为打印日期的表示。它的行为与日期实例无关。什么是currentTimeZoneDate
?这似乎是对日期的深刻误解。日期永远不会“在时区”。日期是一个绝对的时间点。所有的观察者,不管他们在哪里,都应该在给定日期发生的时间上达成一致(忽略相对论效应)
您应该配置UIDatePicker
,使其具有所需的时区。默认值为localTimeZone
,它始终是调用此操作时的当前时区(因此sender.date
已被调整)。如果希望它表示其他时区,请更改UIDatePicker.timeZone
。别把日期弄乱了。绝对不要将其转换为字符串并返回
现在还不清楚scheduleNotification(at:)的作用,或者最终目标是什么<默认情况下,如果时区发生变化,code>NSUserNotification将调整其所有交付日期。如果您不希望这样做(如果您希望保持用户选择的精确时刻,而不是他们选择的标称时间),则应在通知上设置
deliveryTimeZone
(通常设置为NSTimeZone.default
,这是“当前时区”的非更新版本).什么是currentTimeZoneDate
?这似乎是对日期的深刻误解。日期永远不会“在时区”。日期是一个绝对的时间点。所有的观察者,不管他们在哪里,都应该在给定日期发生的时间上达成一致(忽略相对论效应)
您应该配置UIDatePicker
,使其具有所需的时区。默认值为localTimeZone
,它始终是调用此操作时的当前时区(因此sender.date
已被调整)。如果希望它表示其他时区,请更改UIDatePicker.timeZone
。别把日期弄乱了。绝对不要将其转换为字符串并返回
现在还不清楚scheduleNotification(at:)的作用,或者最终目标是什么<默认情况下,如果时区发生变化,code>NSUserNotification将调整其所有交付日期。如果您不希望这样做(如果您希望保持用户选择的精确时刻,而不是他们选择的标称时间),则应在通知上设置
deliveryTimeZone
(通常设置为NSTimeZone.default
,这是“当前时区”的非更新版本).谢谢您的帮助。我只是尝试实现本地通知,但默认情况下它使用UTC时区中的selectedDate。因此,我所做的所有这些只是为了获取当前时区。selectedDate
不能为“UTC”。日期是一个绝对的时间点;它们没有时区(或天数、年份或与日历相关的任何其他内容)。如果您的意思是用户选择的标称时间被解释为UTC,并且您希望它是其他时间,那么请设置日期选择器的时区,以便它正确创建日期。不过,默认的行为是日期选择器使用本地时区,因此这是非常令人惊讶的。一个非常常见的错误是,人们执行类似于print(selectedDate)
的操作,然后看到“UTC”或“+00:00”或其中的任何内容,并认为这意味着它是“在UTC内”。这不是真的。日期没有时区。它们只是以这种方式显示在它们的描述中,以便于人类阅读。感谢帮助。我只是尝试实现本地通知,但默认情况下它使用UTC时区中的selectedDate。因此,我所做的所有这些只是为了获取当前时区。selectedDate
不能是“在UTC中”。日期是一个绝对的时间点;它们没有时区(或天数、年份或与日历相关的任何其他内容)。如果您的意思是用户选择的标称时间被解释为UTC,并且您希望它是其他时间,那么请设置日期选择器的时区,以便它正确创建日期。不过,默认的行为是日期选择器使用本地时区,因此这是非常令人惊讶的。一个非常常见的错误是,人们执行类似于print(selectedDate)
的操作,然后看到“UTC”或“+00:00”或其中的任何内容,并认为这意味着它是“在UTC内”。这不是真的。日期没有时区。它们只是以这种方式显示在它们的描述中,以便于人类阅读。