2012-07-07 92 views
3

我見過以下代碼的許多版本,以便從NSDate中刪除時間元素。剝離NSDate的時間

NSCalendar *cal = [NSCalendar currentCalendar]; 
NSDate *now = [NSDate date]; 
unsigned int intFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; 
NSDateComponents *components = [cal components:intFlags fromDate:now]; 

NSDate *today = [cal dateFromComponents:components]; 

問題是它不按預期方式工作。我目前在英國夏令時(BST)。如果我現在運行這段代碼,現在= @ 「2012-07-07 19點24分06秒+0000」

今天= @ 「2012-07-06 23:00:00 +0000」

什麼我想看到的是今天= @「2012-07-07 00:00:00 +0000」

我只能猜測它與夏令時有關。有任何想法嗎?

回答

4

您將得到午夜BST(GMT + 1小時),這與格林威治標準時間23:00(+0000)相同。

[NSDate date]將在當前時區返回一個日期,所以你的日期是BST。您是否也嘗試設置時區爲GMT:

[components setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]]; 
+0

這沒有竅門,謝謝。儘管如此,我必須承認,這看起來確實違背了直覺上面的「現在」日期是在BST中......在我的原始代碼中,正如你所說,正在返回的是GMT時間。將組件時區設置爲GMT似乎很奇怪。這是否可以在任何時區使用 - 例如:如果現在是在美國東部時間? – 2012-07-08 21:55:01

+0

對不起,剛纔注意到上面的「現在」日期確實在GMT。 – 2012-07-08 22:59:49

0

添加

[components setHour:0]; 
[components setMinute:0]; 
[components setSecond:0]; 

避免使用默認值。文檔甚至沒有說這些值是什麼,所以它們可能不是「0」。

+0

對不起...沒有區別。我甚至嘗試減去時間值從現在剝離他們到組件和減法 - 每次相同的結果 – 2012-07-07 22:02:46

1

有作爲不帶時間的日期沒有這樣的事情,因爲,從來沒有在一個時間點是沒有一個時間(根據我們目前的日程系統無論如何),日期只是一個時間點。埃爾戈,日期必然必須有時間。

你什麼可以做,是格式日期,使時間不顯示。爲此,您使用NSDateFormatter

NSDate *date = [NSDate date]; 
NSCalendar *calendar = [NSCalendar currentCalendar]; 
NSDateComponents *components = [calendar components:(NSEraCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:date]; 

NSDate *todayAtMidnight = [calendar dateFromComponents:components]; 

NSString *formatted = [NSDateFormatter localizedStringFromDate:todayAtMidnight dateStyle: NSDateFormatterMediumStyle]; 
// "formatted" is now something like "Jul 8, 2012". 
// It varies according to your locale and user settings. 

技術上的第一位(設定時間部分到午夜的)是沒有必要的,如果你只是沒有格式化的時間日期,但你可以將它留在如果它讓你覺得你實際上是「消磨時間」。 :)

+0

感謝您的輸入......我想要做的就是存儲日期,然後將它們在線下進行比較,無需擔心日期的時間部分......我意識到我可以在比較步驟中忽略時間元素,但是這似乎效率低下,爲什麼我想把時間設定爲每個我存儲日期的午夜。 – 2012-07-08 21:44:54

+0

+1,這正是我的問題:)謝謝! – tyler53 2013-10-08 01:21:24