簡體   English   中英

從NSString設置NSDate不起作用

[英]Setting NSDate from NSString not working

myObject.theEndmyObject.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];

theEndThu Feb 31Thu Feb 31NSDate *end顯示為1970-5-19 14:30 +0000 NSDate *startNSDate *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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM