我有以下代码来转换带有April 22, 2017
之类的日期的字符串和带有时间4:30 PM
的第二个字符串,我需要在东部时间将这2个字符串转换为一个完整的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:2017年4月22日
scheduledServiceTimeStr:04:30 PM
scheduledServiceDate:可选(2017-04-22 05:00:00 +0000)
scheduledServiceTime:可选(2000-01-01 21:30:00 +0000)
dateAndTime:可选(2017-04-21 20:30:00 +0000)
我遇到的问题是最终结果,控制台末尾显示的dateAndTime
NSDate值为2017-04-21 20:30:00 +0000
,但我认为时间20:30:00
相当于{ {1}}东部时间最初选择的时间是8:30 PM
。据我所知,NSDate没有考虑时区,它只是2001年1月1日以来的秒数表示。正如您所看到的,我在将每个字符串转换为NSDate之前将时区设置为4:30 PM
宾语。我究竟做错了什么?
答案 0 :(得分:2)
我不认为时间有任何问题。 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)
}