在将此问题标记为重复之前,请继续阅读。
我需要比较两个NSDate
。我从具有当前日期的服务器获得的日期。
从NSDate.date()
我得到这个日期 2014-09-25 12:48:23 +0000 这是错误的(时间部分)。我需要增加5个小时才能获得当前时间,所以我做了以下事情。
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd hh:mm:ss ZZZZZ"
let dateString = formatter.stringFromDate(NSDate.date())
结果是正确的日期 - 2014-09-25 06:21:56 +05:30
但是有点麻烦。此日期是字符串,而不是NSDate
。我需要它作为NSDate
对象来将它与另一个日期进行比较。
我尝试将其转换回来,
let date = formatter.dateFromString(dateString)
我得错了结果 - 2014-09-25 00:55:53 +0000 。我尝试将日期字符串传递给新的NSDateFormatter
以查看是否有效,但我仍然得到错误的日期。
我的问题是,如何将此日期字符串转换为NSDate
对象,同时保留正确的时间。
谢谢。
答案 0 :(得分:2)
你对NSDate非常困惑。
NSDate是一个时间点。它没有时区信息。如果我们现在都打电话给[NSDate日期],我们将得到相同的NSDate,即使你在印度我也在英国。那是故意的。这是同一时间。我的手表和手表上显示的时间不同,但NSDate是相同的。您无法将NSDate转换为“印度”日期。
您可以使用日历和时区将NSDates转换为您以用户期望的方式显示给用户的字符串。这就是你所做的。你有一个对印度用户有意义的字符串。如果印度用户键入时间,您将获取该字符串并将其转换为NSDate。 NSDate将在世界时间。如果你和我现在都在我们的手表上键入并转换它,你会输入一个比我早5个半小时的时间。但这是同一时间。如果将其转换为NSDate,我们将获得完全相同的NSDate。
那么你如何改变你的NSDate?很简单:你没有。 NSDate是绝对时间,与您在地球上的位置无关。
答案 1 :(得分:0)
进一步谷歌搜索后,我发现this帖子。它描述的方法完全符合我的要求。原始代码在Objective-C中,因为我的问题是在Swift中,我将发布它的Swift翻译。 \
func toLocalTime() -> NSDate {
let timeZone = NSTimeZone.localTimeZone()
let seconds = timeZone.secondsFromGMTForDate(self)
return NSDate(timeInterval: Double(seconds), sinceDate: self)
}
我将这些添加为NSDate
的扩展方法,因此您可以像这样简单地调用它们。
NSDate.date().toLocalTime()
答案 2 :(得分:0)
您可以使用以下任何NSDate
功能比较两个日期:compare
,earlierDate
,laterDate
,isEqualToDate
。你不应该比较日期字符串(哦,善良,不,想想噩梦);转换日期字符串'进入NSDate'一旦输入。
为了正确比较字符串产生的两个日期,您需要明确日期字符串。在实践中,这需要日期附加时区。如果您的服务器没有提供时区而且无法修改时区,那么您将被迫假设一个(通常是服务器所在的时区,假设一台服务器)。