如何在Swift

时间:2017-04-20 21:45:14

标签: swift swift2 nsdate nsdateformatter

我有以下代码来转换带有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宾语。我究竟做错了什么?

1 个答案:

答案 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)
}