2017-10-28 73 views
-1

我是iOS开发新手,作为一名Android开发人员,我曾经使用过一个对象,该对象使用给定时区(来自Joda-Time库)保存日期时间。如何在iOS中保存带时区的日期时间?

在阅读关于日期和时间的iOS文档(https://developer.apple.com/documentation/foundation/dates_and_times)之后,我仍然怀疑应该使用哪个类来保存日期。鉴于Date/NSDate类描述“一个特定的时间点,独立于任何日历或时区”。它似乎非常无用,因为它独立于时区,没有时区的时间没有任何意义,因为它没有任何上下文。

我真正的问题(TL; DR)

我哪里有时间日期都存储在UTC这样数据库 “YYYY-MM-DD HH:MM:SS”。我想用某种DateFormatter(字符串格式为“yyyy-MM-dd hh:mm:ss”)加上时区(UTC)来初始化一个对象,以便轻松地将其转换为我想要的任何时区(显示给用户在他的默认时区时间)。我如何在iOS中完成这项工作?

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

+3

您声明*“没有时区的时间没有任何意义”*。这显然是错误的。当然这是有道理的。 '日期'是一个时间点。如果我说“现在”,这是一个对世界上每个人都一样的时间点。直到有人想知道“我的时区现在几点钟了?”时区才是无关紧要的。“然后,只需将该“Date”格式化为具有给定时区的“String”即可。 – rmaddy

+0

@rmaddy我可能不得不不同意你的看法。想象一下,有人给你这次注释“1970-12-12 11:40:30”。你不知道什么时候开始,这是不确定的。你所描述的是事件发生后的秒数,对于所有的情况都是一样的。你必须给出一些起点,这是时区的作用。 – Exprove

+0

但字符串“1970-12-12 11:40:30”不是“日期”。这是一个字符串。您将根据特定的时区将该字符串转换为“Date”。一旦你有了'Date',你就可以存储它。稍后,您可以检索它,并且可以将该“Date”转换为您想要的任何时区的字符串。这才是重点。 Date对象没有特定的时区,并且不需要一个。 – rmaddy

回答

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) 
+0

我不认为dateformatter会解决我的问题(至少是“模型”部分)。我可能不是很清楚。想象一下,我有一个带有标题和开始时间的课程活动。标题是一个字符串,开始时间应该是什么(我几乎可以肯定,它不是一个dateformatter)? – Exprove

+0

@证明,签出更新后的帖子,更详细地描述你想要做什么。 –

0

一个Date是一个时间点,如在文档中的其他意见&提及。

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

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)! 

然后转换DateDateFormatterString使用与所述相应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

而且你可以改变输入和输出时区反其道而行之。

+0

将原始字符串转换为“日期”时,您希望将格式器的时区设置为“GMT”的可能性非常小。很可能你想要用户的时区,因为它可能是你分析的本地时间。 – rmaddy

+0

@rmaddy我编辑了答案以提供更多信息。我的意思是当原始日期字符串是UTC时,因为提问者可能想将UTC/GMT日期从数据库转换为本地时区 – LWJ

+0

@LWJ想象一下,我有一个带有标题和开始时间的类Event。标题是一个字符串,开始时间应该是什么? – Exprove

相关问题