Ios 将字符串转换为日期时时区已更改

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

当我将日期(字符串形式)更改为日期形式时,时区将IST更改为UTC。因此,我没有收到通知

我的代码是:

@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
类型(以及它的目标-C
NSDate
)没有任何时区的概念。这只是一个简单的时间戳。这意味着,如果将时区设置为UIDatePicker,则可以使用该时区中的日期,而无需对其进行转换


更多说明:在调试器控制台中
po date
时,调试器只需选择
UTC
时区作为打印日期的表示。它的行为与日期实例无关。

Swift的
Date
类型(以及它的Objective-C
NSDate
)本身没有任何时区概念。这只是一个简单的时间戳。这意味着,如果将时区设置为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内”。这不是真的。日期没有时区。它们只是以这种方式显示在它们的描述中,以便于人类阅读。