如何将 2 个字符串(日期和时间)转换为 Swift 东部时区的一个 NSDate 对象
How to convert 2 Strings (date and time) into one NSDate object in Eastern Time Zone in Swift
我有以下代码来转换日期为 April 22, 2017
的字符串和时间为 4:30 PM
的第二个字符串,我需要将这两个字符串转换为一个完整的 NSDate 对象东部时区。
//convert scheduled date and time from String to NSDate
let scheduledServiceDateStr = orderReview.serviceDate //current format example: April 21, 2017
let scheduledServiceTimeStr = orderReview.serviceTime //current format example: 04:30 PM
print("scheduledServiceDateStr: \(scheduledServiceDateStr)")
print("scheduledServiceTimeStr: \(scheduledServiceTimeStr)")
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MMMM d, yyyy"
dateFormatter.timeZone = NSTimeZone(name: "EST")
let scheduledServiceDate = dateFormatter.dateFromString(scheduledServiceDateStr)
print("scheduledServiceDate: \(scheduledServiceDate)")
let timeFormatter = NSDateFormatter()
timeFormatter.dateFormat = "hh:mm a"
timeFormatter.timeZone = NSTimeZone(name: "EST")
let scheduledServiceTime = timeFormatter.dateFromString(scheduledServiceTimeStr)
print("scheduledServiceTime: \(scheduledServiceTime)")
let timeComponents = NSCalendar.currentCalendar().components([.Hour, .Minute, .Second], fromDate: scheduledServiceTime!)
let dateComponents = NSCalendar.currentCalendar().components([.Year, .Month, .Day, .Hour, .Minute, .Second], fromDate: scheduledServiceDate!)
// append the time to the date
dateComponents.hour = timeComponents.hour
dateComponents.minute = timeComponents.minute
dateComponents.second = timeComponents.second
let dateAndTime = NSCalendar.currentCalendar().dateFromComponents(dateComponents)
print("dateAndTime: \(dateAndTime)")
这是在控制台中打印的内容:
scheduledServiceDateStr: April 22, 2017
scheduledServiceTimeStr: 04:30 PM
scheduledServiceDate: Optional(2017-04-22 05:00:00 +0000)
scheduledServiceTime: Optional(2000-01-01 21:30:00 +0000)
dateAndTime: Optional(2017-04-21 20:30:00 +0000)
我遇到的问题是最终结果,最后在控制台中显示的 dateAndTime
NSDate 值是 2017-04-21 20:30:00 +0000
但是,时间 20:30:00
我认为是等效的到 8:30 PM
东部时间,而最初选择的时间是 4:30 PM
。我知道 NSDate 没有考虑时区,它只是表示自 2001 年 1 月 1 日以来的秒数。如您所见,在将每个字符串转换为 NSDate 之前,我将时区设置为 EST
目的。我究竟做错了什么?
我不认为时间有什么问题。 EST 是 -04:00,所以 16:30 EST = 20:30 GMT
。你写了更多需要的代码:
let scheduledServiceDateStr = "April 21, 2017"
let scheduledServiceTimeStr = "04:30 PM"
let formatter = DateFormatter()
formatter.dateFormat = "MMM dd, yyyy hh:mm a"
formatter.timeZone = TimeZone(identifier: "EST")
if let date = formatter.date(from: scheduledServiceDateStr + " " + scheduledServiceTimeStr) {
print(date)
}
我有以下代码来转换日期为 April 22, 2017
的字符串和时间为 4:30 PM
的第二个字符串,我需要将这两个字符串转换为一个完整的 NSDate 对象东部时区。
//convert scheduled date and time from String to NSDate
let scheduledServiceDateStr = orderReview.serviceDate //current format example: April 21, 2017
let scheduledServiceTimeStr = orderReview.serviceTime //current format example: 04:30 PM
print("scheduledServiceDateStr: \(scheduledServiceDateStr)")
print("scheduledServiceTimeStr: \(scheduledServiceTimeStr)")
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MMMM d, yyyy"
dateFormatter.timeZone = NSTimeZone(name: "EST")
let scheduledServiceDate = dateFormatter.dateFromString(scheduledServiceDateStr)
print("scheduledServiceDate: \(scheduledServiceDate)")
let timeFormatter = NSDateFormatter()
timeFormatter.dateFormat = "hh:mm a"
timeFormatter.timeZone = NSTimeZone(name: "EST")
let scheduledServiceTime = timeFormatter.dateFromString(scheduledServiceTimeStr)
print("scheduledServiceTime: \(scheduledServiceTime)")
let timeComponents = NSCalendar.currentCalendar().components([.Hour, .Minute, .Second], fromDate: scheduledServiceTime!)
let dateComponents = NSCalendar.currentCalendar().components([.Year, .Month, .Day, .Hour, .Minute, .Second], fromDate: scheduledServiceDate!)
// append the time to the date
dateComponents.hour = timeComponents.hour
dateComponents.minute = timeComponents.minute
dateComponents.second = timeComponents.second
let dateAndTime = NSCalendar.currentCalendar().dateFromComponents(dateComponents)
print("dateAndTime: \(dateAndTime)")
这是在控制台中打印的内容:
scheduledServiceDateStr: April 22, 2017
scheduledServiceTimeStr: 04:30 PM
scheduledServiceDate: Optional(2017-04-22 05:00:00 +0000)
scheduledServiceTime: Optional(2000-01-01 21:30:00 +0000)
dateAndTime: Optional(2017-04-21 20:30:00 +0000)
我遇到的问题是最终结果,最后在控制台中显示的 dateAndTime
NSDate 值是 2017-04-21 20:30:00 +0000
但是,时间 20:30:00
我认为是等效的到 8:30 PM
东部时间,而最初选择的时间是 4:30 PM
。我知道 NSDate 没有考虑时区,它只是表示自 2001 年 1 月 1 日以来的秒数。如您所见,在将每个字符串转换为 NSDate 之前,我将时区设置为 EST
目的。我究竟做错了什么?
我不认为时间有什么问题。 EST 是 -04:00,所以 16:30 EST = 20:30 GMT
。你写了更多需要的代码:
let scheduledServiceDateStr = "April 21, 2017"
let scheduledServiceTimeStr = "04:30 PM"
let formatter = DateFormatter()
formatter.dateFormat = "MMM dd, yyyy hh:mm a"
formatter.timeZone = TimeZone(identifier: "EST")
if let date = formatter.date(from: scheduledServiceDateStr + " " + scheduledServiceTimeStr) {
print(date)
}