[英]Setting NSDate from NSString not working
myObject.theEnd
和myObject.theStart
是字符串,日期格式為Thu Feb 31
就像明智的選擇一樣...
NSDateFormatter *format=[[NSDateFormatter alloc] init];
[format setDateFormat:@"EEE MMM dd"];
NSDate *end = [format dateFromString:myObject.theEnd];
NSDate *start = [format dateFromString:myObject.theStart];
NSDate *current = [NSDate date];
當theEnd
為Thu Feb 31
日Thu Feb 31
, NSDate *end
顯示為1970-5-19 14:30 +0000
。 NSDate *start
和NSDate *current
。
為什么是這樣 ? 而我該如何解決呢?
我打賭theEnd
不會顯示為1970-05-19 14:30 +0000
。 我敢打賭,由於從未有2月31日,因此顯示為(null)
! 例如我得到:
NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"EEE MMM dd"];
NSDate *end = [format dateFromString:@"Thu Feb 31"];
NSLog(@"end = %@", end);
=>
2012-05-20 16:38:31.620 test-date[42307:707] end = (null)
另外,我敢打賭,您所在的時區位於UTC東部9.5小時。 1970-05-19 14:30 +0000
實際上是當您解析今天的1970-05-19 14:30 +0000
Sun May 20
。 例如,我目前在BST,所以UTC + 0100,我得到:
NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"EEE MMM dd"];
NSDate *start = [format dateFromString:@"Sun May 20"];
NSLog(@"start = %@", start);
=>
2012-05-20 16:38:31.621 test-date[42307:707] start = 1970-05-19 23:00:00 +0000
由於它在當前時區(即UTC中的1970-05-19 23:00:00 +0000
)中解析為1970-05-20 00:00:00
(沒有年份,因此分量為“ 0
” = 1970
)。
如果您想解決該問題,請將格式化程序的時區設置為UTC:
[format setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
要將年份納入當前年份,您可以執行以下操作:
NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"EEE MMM dd"];
[format setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
NSDate *start = [format dateFromString:@"Sun May 20"];
NSLog(@"start = %@", start);
NSDate *today = [NSDate date];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *todayComponents = [gregorian components:NSYearCalendarUnit fromDate:today];
NSDateComponents *startComponents = [gregorian components:(NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:start];
[startComponents setYear:[todayComponents year]];
[startComponents setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
start = [gregorian dateFromComponents:startComponents];
NSLog(@"start = %@", start);
它不是那么漂亮,但是可以。 或者,您可以只將當前年份附加到傳遞給格式化程序的字符串上,然后將yyyy
添加到格式化程序樣式中:
NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"EEE MMM dd yyyy"];
[format setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
NSDate *today = [NSDate date];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *todayComponents = [gregorian components:NSYearCalendarUnit fromDate:today];
NSString *dateString = [NSString stringWithFormat:@"Sun May 20 %i", [todayComponents year]];
NSDate *start = [format dateFromString:dateString];
NSLog(@"start = %@", start);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.