2015-02-10 145 views
1

我在我的應用程序中使用CET作爲我的默認timezone。在德國Daylight保存時間將從開始2015年3月29日。現在我正在做一些測試,看看我的日期是否將在未來正確轉換。我用下面的代碼來測試它。帶日光節約時間的NSDateFormatter不正確的時間字符串

NSTimeZone *timeZone = [NSTimeZone timeZoneWithAbbreviation:@"CET"]; 
[NSTimeZone setDefaultTimeZone:timeZone]; 

NSDate *now = [NSDate date]; // 10 Feb, 2015 
NSDate *dateAfter29March = [now dateByAddingMonths:2]; // 10 April, 2015 

NSDateFormatter *formatter = [NSDateFormatter new]; 
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss ZZZ"]; 
[formatter setTimeZone:timeZone]; 

NSLog(@" NOW DATE -> %@",[formatter stringFromDate:now]); 
NSLog(@" DATE AFTER 29 March -> %@",[formatter stringFromDate:dateAfter29March]); 

類別方法添加個月

- (NSDate *)dateByAddingMonths:(NSInteger) dMonths { 
    NSDateComponents *components = [[NSDateComponents alloc] init]; 
    components.month = dMonths; 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 
    return [calendar dateByAddingComponents:components toDate:self options:0]; 
} 

控制檯輸出如下:

NOW DATE -> 2015-02-10 18:28:05 +0100 
DATE AFTER 29 March -> 2015-04-10 18:28:05 +0200 

凡我對日期預期時間後,3月29日17:28爲: 05如現在的一小時,減去白天的時間。我究竟做錯了什麼?

PS:我也嘗試設置標籤中的輸出字符串,並沒有發生變化。

+0

顯示'dateByAddingMonths:'的代碼。 – rmaddy 2015-02-10 17:44:37

+0

是的,問題是你的方法'dateByAddingMonths:'。我在操場上試過'var dateAfter29March = now.dateByAddingTimeInterval(2 * 30 * 24 * 60 * 60)',它工作正常(顯示:''Apr 11,2015,7:49 PM'',where now ='Feb 10 ,2015年,下午6點53分「')。 – Q8i 2015-02-10 17:50:55

+0

我已經更新了我的代碼。 – 2015-02-10 17:53:57

回答

1

試試這個;

[NSTimeZone setDefaultTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

NSDate *now = [NSDate date]; // 10 Feb, 2015 
NSDate *dateAfter29March = [self dateByAddingMonths:2 date:now]; // 10 April, 2015 


NSLog(@"now -> %@", now); 
NSLog(@"dateAfter29March -> %@", dateAfter29March); 
NSLog(@"========================================"); 


NSTimeZone *timeZone = [NSTimeZone timeZoneWithAbbreviation:@"CET"]; 

NSDateFormatter *formatter = [NSDateFormatter new]; 
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss ZZZ"]; 
[formatter setTimeZone:timeZone]; 

NSLog(@"NOW DATE -> %@",[formatter stringFromDate:now]); 
NSLog(@"DATE AFTER 29 March -> %@",[formatter stringFromDate:dateAfter29March]); 

它對我來說工作得很好。查看日誌

now -> 2015-02-11 06:01:56 +0000 
dateAfter29March -> 2015-04-11 06:01:56 +0000 
======================================== 
NOW DATE -> 2015-02-11 07:01:56 +0100 
DATE AFTER 29 March -> 2015-04-11 08:01:56 +0200 
0

您可以使用nextDaylightSavingTimeTransition找出是下一個夏令時區時間轉換時:

NSTimeZone(abbreviation: "CET")!.nextDaylightSavingTimeTransition! // "Mar 28, 2015, 22:00" 

您可以創建一個NSDateFormatter擴展使用CET格式化你的時間時區如下:

extension NSDate { 
    var time:String { 
     let formatter = NSDateFormatter() 
     formatter.timeZone = NSTimeZone(abbreviation: "CET") 
     formatter.dateFormat = "HH:mm" 
     return formatter.stringFromDate(self) 
    } 
} 



let futureDate = NSCalendar.currentCalendar().dateWithEra(1, year: 2015, month: 3, day: 27, hour: 13, minute: 0, second: 0, nanosecond: 0)! 
let futureDateDLST = NSCalendar.currentCalendar().dateWithEra(1, year: 2015, month: 3, day: 29, hour: 13, minute: 0, second: 0, nanosecond: 0)! 

futureDate.time  // 17:00" 
futureDateDLST.time // "18:00" 
2

我真的不明白你在抱怨什麼。

您要求操作系統添加兩個月的日期。添加兩個月意味着它使用日曆,並在同一個月的同一天返回兩個月後的日期。它應該考慮到DST的變化,它會。這就是增加兩個月的意義。

想象一下,我們在每個月的第一天早上10點舉行會議。你希望在早上10點開會,無論是否是DST。

+0

我喜歡那個會議的例子。由於我遇到了DST問題,我不再喜歡DST。在此之前,我是中立的。 PostgreSQL至少存儲時區數據,MySQL不會:P – 2015-12-29 19:02:39

相關問題