2014-09-25 116 views
0

在将此问题标记为重复项之前,请继续阅读。从字符串获取NSDate对象

我需要比较两个NSDate s。我从具有当前日期的服务器获取的日期。

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年9月25日6点21分56秒+05:30

但有一个小麻烦。这个日期是一个字符串,而不是NSDate。我需要它是一个NSDate对象来比较它与另一个日期。

我试图将其转换回这个样子,

let date = formatter.dateFromString(dateString) 

我也得到一个错误的结果 - 2014年9月25日0点55分53秒+0000。我试着将日期字符串传递给一个新的NSDateFormatter,看看是否有效,但我仍然得到错误的日期。

我的问题是,我怎样才能将这个日期字符串转换为一个NSDate对象,它也保留了正确的时间。

谢谢。

+0

http://stackoverflow.com/questions/24089999/how-do-you-create-a-swift-date-object – 2014-09-25 13:04:55

+0

也许你可能忘了设置dateFormatter的时区? – 2014-09-25 13:04:59

+0

查看NSDate使用默认timeZone(即GMT),并获得一个特定时间区的时间,你可以使用NSDateFormatter。在你使用NSDateFormatter(默认情况下会占用你的时区而不是GM)后,你的情况会显示不同的时间,然后NSDate。 – nikhil84 2014-09-25 13:05:35

回答

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

你对NSDate非常困惑。

NSDate是一个时间点。它没有时区信息。如果我们现在都打电话给[NSDate date],即使您在印度,而且我在英国,我们也会得到相同的NSDate。这是故意的。这是同一时间。我的手表和手表上显示的时间不同,但NSDate是相同的。您无法将NSDate转换为“印度”日期。

您可以使用日历和时区将NSDate转换为您向用户显示的字符串,方式与用户所期望的一样。这就是你所做的。你有一个对印度用户有意义的字符串。如果印度用户输入时间,则将该字符串转换为NSDate。 NSDate将在世界时。如果您和我现在都在我们的手表上键入了时间并将其转换,您可以输入一个比我的时间早5个半小时的时间。但这是同一时间。如果您将其转换为NSDate,我们都会得到完全相同的NSDate。

那么你如何改变你的NSDate?很简单:你没有。 NSDate是绝对的时间,与您在地球上的位置无关。

+0

我不想改变我的'NSDate'。我只想要一个当前时间的'NSDate'对象。无论如何,我能够完成它。我添加了代码作为答案。 – Isuru 2014-09-25 13:58:53

+1

@ gnasher729是正确的。你正在比较'NSDates'的字符串表示,它将(不用你选择)应用本地时区。直接使用date.compare(otherDate)比较NSDates。 – Grimxn 2014-09-25 14:27:15

0

您可以比较使用以下任一NSDate功能两个日期:compareearlierDatelaterDateisEqualToDate。你不应该比较日期字符串(哦,善良,不,想到噩梦);一旦输入,就将'日期字符串'转换为'NSDate'。

为了比较两个由字符串正确生成的日期,您需要日期字符串是明确的。实际上,这要求日期附加时区。如果你的服务器没有提供时区并且不能被修改为提供时区,那么你将被迫假设一个(通常是服务器所在的时区,假定一个服务器)。

相关问题