0

NSDateComponentsとNSDateFormatterから奇妙な結果が得られています。

指定された日付の時間を午前10時に設定するには、次の方法があります

+ (NSDate *)getTenOClockOnDate:(NSDate*)inputDate
{

NSCalendar *cal = [NSCalendar autoupdatingCurrentCalendar];

NSDateComponents *components = [cal components:( NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit ) fromDate:inputDate];

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

// construct new date and return
NSDate *newDate = [cal dateFromComponents:components];

NSLog(@"input date: %@ -- new date: %@", inputDate, newDate);

return newDate;
}

私が次の電話をかけている間:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd"];    
[MyUtils getTenOClockOnDate:[dateFormatter dateFromString:@"2010-12-31"]];
[MyUtils getTenOClockOnDate:[dateFormatter dateFromString:@"2011-01-01"]];
[MyUtils getTenOClockOnDate:[dateFormatter dateFromString:@"2011-01-02"]];

2行目だけで、予期しない結果が得られます。

input date: 2010-12-31 05:00:00 GMT -- new date: 2010-12-31 15:00:00 GMT
input date: 2011-01-01 05:00:00 GMT -- new date: 2011-12-31 15:00:00 GMT
input date: 2011-01-02 05:00:00 GMT -- new date: 2011-01-02 15:00:00 GMT

問題は2番目のレコード2011-01-01にあり、時間を10に設定するだけで2011-12-31になります。

4

3 に答える 3

1

Println(date)Swiftでは正しくありませんnsdateformatterstringfromdate

これは、Objective-Cのnslogにも当てはまると思います

于 2015-04-13T13:28:23.073 に答える
0

これにより、NSDateComponentsから正しいNSDate値が得られます。

NSDateFormatter* df = [[NSDateFormatter alloc]init];
[df setDateFormat:@"yyyy-MM-dd"];
NSDate* date = [df dateFromString:@"2011-01-01"];
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:date];
NSInteger day = [components day];    
NSInteger month = [components month];
NSInteger year = [components year];
[df release];

NSLog(@"Day : %d, Month : %d, Year : %d",day,month,year);

それはあなたを助けるかもしれません。

于 2011-05-03T06:57:47.780 に答える
0

これは確かにかなり奇妙に見えます...あなたのコードは問題ないように見えますが、私の予感は、NSDateComponentsオブジェクトを初期化するときに、とを有効にしていないことNSHourCalendarUnitですNSMinuteCalendarUnit

これは必要ないと思うかもしれませんが、私は同様の問題を抱えていたと思います。日付の時刻を正しく変更して、目的の結果を得るには、これらをオンにする必要があることがわかりました。

それでも問題が解決しない場合は、カレンダーのタイムゾーンを設定する必要があるかもしれません。これは、私が行っていることとの唯一の違いであり、魅力的に機能しているように見えるからです。

于 2011-03-09T12:28:46.320 に答える