Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从字符串获取NSDate对象_Ios_Swift_Nsdate_Nsdateformatter_Gmt - Fatal编程技术网

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。