从字符串中获取NSDate对象

时间:2014-09-25 13:00:50

标签: ios swift nsdate nsdateformatter gmt

在将此问题标记为重复之前,请继续阅读。

我需要比较两个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对象,同时保留正确的时间。

谢谢。

3 个答案:

答案 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功能比较两个日期:compareearlierDatelaterDateisEqualToDate。你不应该比较日期字符串(哦,善良,不,想想噩梦);转换日期字符串'进入NSDate'一旦输入。

为了正确比较字符串产生的两个日期,您需要明确日期字符串。在实践中,这需要日期附加时区。如果您的服务器没有提供时区而且无法修改时区,那么您将被迫假设一个(通常是服务器所在的时区,假设一台服务器)。