2016-12-21 27 views
-1

我想dateString这种格式"2016-12-22T08:00:00-08:00"转换为日期对象在用户本地时间例如2016-12-22 21:30:00 +0530当用户的时间是+05:30从UTC转换日期字符串到本地时间日期对象斯威夫特

OR

欲dateString这种格式"2016-12-22T08:00"它是PST时间被转换成日期对象在用户本地时间例如2016-12-22 21:30:00 +0530当用户的时间是05:从UTC或2016-12-22 16:00:00 +0000当用户的时间是00 30 :00 from UTC

当我tr y下面的代码和打印日期对象打印Optional(2016-12-22 02:30:00 +0000),但我想2016-12-22 21:30:00 +0530因为我的本地时间是从UTC UTC05:30。

let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss-08:00" 
dateFormatter.timeZone = NSTimeZone.local 

let dateString = "2016-12-22T08:00:00-08:00" 
let dateObject = dateFormatter.date(from: dateString) 
print("dateObject \(dateObject1)") 
+0

不清楚为什么当问题清楚时以及在SO上没有类似的问题时,它被拒绝投票。 – user44776

+1

我没有投票,但有几百个几乎相同的问题。之前你一直没有问过你问过的任何问题。 – rmaddy

+0

顺便说一句,为什么你关心什么时区产生的ISO 8601日期字符串显示?此时区不是日期对象的一部分。大多数人实际上会使用GMT/UTC /祖鲁语来避免这种混淆...... – Rob

回答

3

解决您的dateFormat到:

dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ" 

取出timeZone线。由于日期字符串指定了自己的时区,因此不需要。

dateFormatter.timeZone = NSTimeZone.local // remove this line 

现在你的代码工作正常。

“别急,的print(dataObject)输出是不是我想要的”

是的。就像你之前的数千人一样,你误解了打印Date对象的输出。

如果你想在本地时区查看Date,在给定的格式,用DateFormatterDate转换为String。您将默认获取当前的本地时区。

let dateFormatter = DateFormatter() 
dateFormatter.dateStyle = .long 
dateFormatter.timeStyle = .long 
let newString = dateFormatter.string(from: dateObject) 
print(newString) 

而你得到的只是你想要的。

+0

您建议进行更改,当UTC时间为+0530时,它仍以UTC时间打印出来。例如打印'可选(2016-12-22 16:00:00 +0000)',但我期待'可选(2016-12-22 21:30:00 +0530)' – user44776

+0

当然。不要在'Date'上使用'print'。直到你明白发生了什么,它才会令人困惑。使用我在答案的后半部分发布的代码来获得所需的输出(当然,您可以自由更改日期/时间样式或使用特定格式来满足您的需求)。 – rmaddy

+1

不相关,但是他也可能希望在第一个格式化程序中将'locale'设置为'en_US_POSIX',该格式程序从IS8601/RFC3339字符串到'Date'对象,但是[技术问答1480](https: //developer.apple.com/library/content/qa/qa1480/_index.html)。 – Rob

相关问题