如何在iOS中使用时区保存日期时间?

时间:2017-10-28 22:45:04

标签: ios swift nsdate swift4

我是iOS开发新手,我以前习惯使用的Android开发人员有一个对象,可以使用给定时区保存日期时间(来自Joda-Time库)。

在阅读关于日期和时间(https://developer.apple.com/documentation/foundation/dates_and_times)的iOS文档后,我仍然怀疑应该使用哪个类来保存日期时间。给定----------------------- Fragments len: 0 // Correct (this is first fragment so nothing is in map) key>192.168.1.3 192.168.1.4 6 1 Not Found // So it's added into map ----------------------- Fragments len: 1 // Correct (1st fragment is in map) key>192.168.1.5 192.168.1.6 6 1 Found // Not correct...keys are different ----------------------- Fragments len: 1 key>192.168.1.5 192.168.1.6 6 1 Found ----------------------- Fragments len: 1 key>192.168.1.5 192.168.1.6 6 1 Found ----------------------- 类描述"特定时间点,独立于任何日历或时区。"它似乎非常无用,因为它是独立于时区的,没有时区的时间没有任何意义,因为它没有任何背景。

我的真正问题(TL; DR)

我有一个数据库,其日期时间以UTC格式存储,如" yyyy-MM-dd hh:mm:ss" 。我想初始化一个带有某种DateFormatter的对象(带有这种格式的字符串" yyyy-MM-dd hh:mm:ss")加上一个时区(UTC)可以轻松转换为我想要的任何时区(向用户显示其默认时区时间)。我怎样才能在iOS中实现这一目标?

编辑:想象一下,我有一个带有标题和开始时间的课程。标题是一个字符串,应该是什么开始时间?

2 个答案:

答案 0 :(得分:1)

您可以使用DateFormatter

let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .iso8601)
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
formatter.timeZone = TimeZone(secondsFromGMT: 0)

formatter.locale设置用户的当前区域设置,formatter.dateFormat设置所需的日期格式。在您的情况下yyyy-MM-dd HH:mm:ss

简单地称呼它:

let utcDateFromServer = "2017-01-01 22:10:10"
let date = formatter.date(from: utcDateFromServer)

答案 1 :(得分:0)

Date是一个时间点,正如其他评论&在文档中。

如果您想将UTC时间转换为当地时间,则需要先使用String将数据库中的"yyyy-MM-dd hh:mm:ss" Date转换为DateFormatter

let dateStringUTC = "2018-01-01 00:00:00"

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss"
//Set the input timezone (if you don't set anything, the default is user's local time)
dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
let date : Date = dateFormatter.date(from: dateStringUTC)! 

然后使用DateString转换回DateFormatter TimeZone

let outputDateFormatter = DateFormatter()
outputDateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss"
//Set the output timezone (if you don't set anything, the default is user's local time)
//outputDateFormatter.timeZone = someTimeZone
let dateString = outputDateFormatter.string(from: date)

print(dateString)

输出:2017-12-31 17:00:00

你可以改变输入和输出时区来做相反的事情。