Ios 从字符串获取NSDate对象
在将此问题标记为重复问题之前,请继续阅读 我需要比较两个Ios 从字符串获取NSDate对象,ios,swift,nsdate,nsdateformatter,gmt,Ios,Swift,Nsdate,Nsdateformatter,Gmt,在将此问题标记为重复问题之前,请继续阅读 我需要比较两个NSDates。我从服务器获取的日期与当前日期一致 从NSDate.date()我得到了这个日期2014-09-25 12:48:23+0000,它是错误的(时间部分)。我需要增加5个小时来获取当前时间,所以我做了以下操作 let formatter = NSDateFormatter() formatter.dateFormat = "yyyy-MM-dd hh:mm:ss ZZZZZ" let dateString = formatte
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-09-2506:21:56+05:30
但是有一点小问题。此日期是字符串,不是NSDate
。我需要它是一个NSDate
对象,以便将它与另一个日期进行比较
我试着像这样把它转换回去
let date = formatter.dateFromString(dateString)
我得到了一个错误的结果-2014-09-25 00:55:53+0000。我尝试将日期字符串传递给一个新的NSDateFormatter
,看看它是否有效,但我还是得到了错误的日期
我的问题是,如何将此日期字符串转换为同时保留正确时间的NSDate
对象
谢谢。您对NSDate完全感到困惑 NSDate是一个时间点。它没有时区信息。如果我们现在都调用[NSDate date],我们将得到相同的NSDate,即使您在印度,我在英国。那是故意的。是同一时间。我的手表和你的手表上显示的时间不同,但NSDate是相同的。您不能将NSDate转换为“印度”日期 您可以使用日历和时区将NSDate转换为字符串,以用户期望的方式显示给用户。你就是这么做的。你有一个对印度用户有意义的字符串。如果一个印度用户输入一个时间,你就把这个字符串转换成一个NSDate。日期将是世界时。如果你和我现在都在手表上输入时间并进行转换,你会输入一个比我早5个半小时的时间。但这是同一时间。如果您将其转换为NSDate,我们将获得完全相同的NSDate
那么你如何更改你的NSDate?很简单:你没有。NSDate是绝对时间,与您在地球上的位置无关 在进一步的谷歌搜索中,我发现了这篇文章。其中描述的方法正是我想要的。原始代码是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()
您可以使用以下任一功能比较两个日期:
compare
,earlierDate
,laterDate
,isEqualToDate
。你不应该比较日期字符串(哦,天哪,不,想想噩梦);输入后立即将“日期字符串”转换为“NSDate”
为了正确比较由字符串生成的两个日期,需要明确日期字符串。实际上,这需要在日期上附加一个时区。如果您的服务器未提供时区,并且无法修改以提供时区,则您将被迫使用一个时区(通常是服务器所在的时区,假设为一台服务器)。您可能忘记设置dateFormatter的时区?请参阅NSDate使用默认时区(即GMT)要获取特定时区的时间,可以使用NSDateFormatter。在您使用NSDateFormatter后(默认情况下,它将使用您的时区而不是GM),因此将显示不同于NSDate的时间。不是GMT,您有5小时的差异否?因此时区将为GMT+5.00NSDate表示一个绝对时间点(从某个参考日期算起以秒为单位),不知道时区。其描述2014-09-25 12:48:23+0000使用GMT,这与2014-09-25 06:21:56+05:30的时间点完全相同。所以说第一个是错误的,第二个是正确的是没有意义的。我不想更改我的
NSDate
。我只想要一个我当前时间的NSDate
对象。无论如何,我能够完成它。我添加了代码作为答案。@gnasher729是正确的。您正在比较NSDates
的字符串表示形式,这将(无需您选择)应用本地时区。直接使用date.Compare(其他日期)比较NSDate。