2012-09-12 102 views
1

我有一個NSDate(讓我們叫它x),12 September, 2012 10:18PM (GMT)。我想在我目前的時區(EST)午夜之前將x轉換爲一分鐘。因此,在EST中代表的x代表NSDateFormatter,轉換後代表12 September, 2012 11:59PM (EST)。什麼是最好的方法來做到這一點? 謝謝轉換NSDate

+2

從我的頭頂,使用'NSDateComponents'對象,它的'TimeZone'到EST和組件設置爲23小時,59分鐘,從作出之日起休息。然後,用'Gregorian'標識符分配'NSCalendar',並得到最終日期:'dateFromComponents:'...或者等待正確的答案:) – Mazyod

回答

2

在NSDateComponents請看下圖:https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSDateComponents_Class/Reference/Reference.html

我相信你需要的的NSDate轉換爲NSDateComponents,設定時間爲11:59 PM,然後再轉換回的NSDate。

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *components = [calendar components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit) fromDate:date]; 
[components setHour:23]; 
[components setMinute:59]; 
NSDate *convertedDate = [calendar dateFromComponents:components]; 

NSLog(@"date=%@, convertedDate=%@", date, convertedDate); 
+0

+1,這就是我所說的。只需添加'setTimeZone:'來指定'EST'。 – Mazyod

+0

這是否考慮到localTimezone或僅在參照GMT時將日期轉換爲午夜前一分鐘? – 0xSina

+0

是的,來自http://developer.apple.com/library/ios/documentation/cocoa/Conceptual/DatesAndTimes/Articles/dtTimeZones.html#//apple_ref/doc/uid/20000185-SW1:「默認情況下,NSCalendar使用創建日曆對象時應用程序或進程的默認時區。除非默認時區已被設置,否則它是系統首選項中設置的時區。「 – jrc

2

這樣的操作可以很容易地用日期的數字表示來完成。在此表示中,您處理自參考日期以來的秒數。

針對timeIntervalSinceReferenceDate的參考日期爲1月1日st 2001年,格林威治標準時間00:00:00。

NSDate* date = [NSDate date]; 
NSInteger secondsSinceReferenceDate = [date timeIntervalSinceReferenceDate]; 
secondsSinceReferenceDate += 86400 - (secondsSinceReferenceDate % 86400); 
secondsSinceReferenceDate -= 60; 
secondsSinceReferenceDate -= [NSTimeZone.localTimeZone secondsFromGMTForDate:date]; 
NSDate* justBeforeToday = 
    [NSDate dateWithTimeIntervalSinceReferenceDate:secondsSinceReferenceDate]; 

NSLog(@"Date used was %@", date); 
NSLog(@"Just before tomorrow is %@", justBeforeToday); 

既然有86400秒,每天(24小時時間60分鐘60次60秒= 86400秒),你知道86400 - (secondsSinceReferenceDate % 86400)是秒數仍有到午夜。因此,如果您拿到今天的日期(或任何其他有效日期),請添加此秒數,然後再減去60秒,您將在格林威治標準時區的今天晚上11:59 PM。

[NSTimeZone.localTimeZone secondsFromGMTForDate:],你知道你的時區偏離GMT時區多少秒。通過將此偏移量減去整數表達式,您可以在當地時區下午11:59時實際獲得該偏移量。

下面是一個示例輸出:

Date used was 2012-09-12 22:37:49 +0000 
Just before tomorrow is 2012-09-13 03:59:00 +0000 

我在EDT時區太,這看起來像正確答案(記住標準時間爲-5從格林尼治標準時間,但是現在我們是在日光節省,所以它是從格林威治標準時間-4,這是不變的)。

+0

這是否考慮了時區?輸入的NSDate是格林尼治標準時間,輸出的NSDate格林尼治標準時間,但當轉換到當前時區將產生在當前時區午夜前一分鐘。 – 0xSina

+0

@ 0xSina,我誤解了您的問題中的許多內容,我會盡快發佈更新。 – zneak

+0

@ 0xSina,我的更新解決您的疑慮。 – zneak