5

ある年の口の最初の週の日付を調べたい:

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [[NSDateComponents alloc] init];
[components setYear:2013];
[components setMonth:1];
[components setWeekOfMonth:1];
[components setWeekday:1];
NSDate *newDate = [calendar dateFromComponents:components];
NSLog(@"%@",newDate);

私が得るものは次のとおりです。

2012-12-29 23:00:00 +0000

そして、私のMacカレンダーと比較すると、取得する必要があるのは次のとおりです。

2012-12-31 23:00:00 +0000

助言がありますか?

4

2 に答える 2

4

(私はあなたが今何が起こっているのかを理解したことを理解していますが、将来の読者のために...)

ここで何をしているのか見てみましょう。

NSDateComponents *components = [[NSDateComponents alloc] init];
[components setYear:2013];
[components setMonth:1];
[components setWeekOfMonth:1];
[components setWeekday:1];

今日(2013年2月28日)を例として取り上げて、各ステップの後に何が得られるかを見てみましょう(仮に、これは確認できません!):

  • setYear:2013-年はすでに2013年であるため、変更はありません
  • setMonth:1-1月に変更:2013-01-28
  • setWeekOfMonth:1-2013年1月の第1週に同じ曜日(木曜日)に変更:2013-01-03
  • setWeekday:1-同じ週の日曜日に変更:2012-12-30

2012-12-30のローカルの真夜中を印刷すると、UTCでは、おそらくローカルのタイムゾーンがUTCより1時間進んでいるため、「2012-12-2923:00:00+0000」が表示されます。

したがって、すでに確立しているので、「1月の第1週の日曜日」ではなく、「1月1日」が本当に必要であると仮定して、 /setDayの代わりに必要です。setWeekOfMonthsetWeekday

于 2013-02-28T14:00:16.470 に答える
0

weekDay ここに作業コードがある設定に問題がある可能性があります

 NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *components = [[NSDateComponents alloc] init];
    [components setYear:2013];
    [components setMonth:1];
    [components setDay:1];

    NSDate *newDate = [calendar dateFromComponents:components];
    NSLog(@"%@",newDate); //2012-12-31 23:00:00 +0000

NSGregorianCalendarの代わりに使用できる他の代替手段currentCalender

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
        NSDateComponents *comp = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:[NSDate date]];
[comp setYear:2013];
[comp setMonth:1];
[comp setDay:1];
NSDate *firstDayOfMonthDate = [gregorian dateFromComponents:comp];
NSLog(@"%@",firstDayOfMonthDate);  // 2012-12-31 23:00:00 +0000
于 2013-02-28T13:41:18.463 に答える