2014-09-25 133 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'。

爲了比較兩個由字符串正確生成的日期,您需要日期字符串是明確的。實際上,這要求日期附加時區。如果你的服務器沒有提供時區並且不能被修改爲提供時區,那麼你將被迫假設一個(通常是服務器所在的時區,假定一個服務器)。