0

私はこの方法を使用して、月と年を、指定された年の月の最後の日に等しい日付に変換しています。

+ (NSDate*)endOfMonthDateForMonth:(int)month year:(int)year
{
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *comps = [[NSDateComponents alloc] init];
    comps.year = year;
    comps.month = month;

    NSDate *monthYearDate = [calendar dateFromComponents:comps];

    // daysRange.length will contain the number of the last day of the endMonth:
    NSRange daysRange = [calendar rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:monthYearDate];
    comps.day = daysRange.length;
    comps.hour = 0;
    comps.minute = 0;
    comps.second = 0;
    [comps setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    [calendar setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    [calendar setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
    NSDate *endDate = [calendar dateFromComponents:comps];
    return endDate;
}

日付に00:00:00の時間コンポーネントを設定したいので、タイムゾーンをGMT 0に設定し、分、時間、秒の日付コンポーネントを0に設定しました。メソッドから返される日付は正しく、 00:00:00からの時間コンポーネント。

これが私がCoreDataに日付を保存する方法です:

NSDate *endDate = [IBEstPeriod endOfMonthDateForMonth:endMonth year:endCalYear];
[annualPeriod setEndDate:endDate];

データを取得してデバッガコンソールにNSLロギングした後2008-12-30 23:00:00 +0000、時間コンポーネント!=0のような日付を取得します。

コンポーネントが変更されたのはなぜですか?00:00:00にとどまるべきではありませんか?

ここで何を間違ってコーディングしましたか?

ありがとうございました!!

4

2 に答える 2

3

カレンダーを作成した後、カレンダーのタイムゾーンを設定する必要があります。

これを関数の2行目として追加します。

calendar.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];

ただし、これを行う簡単な方法は次のとおりです。

- (NSDate*)endOfMonthDateForMonth:(int)month year:(int)year
{
    NSCalendar *calendar    = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    calendar.timeZone       = [NSTimeZone timeZoneWithName:@"UTC"];

    NSDateComponents *comps = [[NSDateComponents alloc] init];
    comps.year              = year;
    comps.month             = month+1;
    comps.day               = 0;

    NSDate *monthYearDate   = [calendar dateFromComponents:comps];
    return monthYearDate;
}

結果:

NSLog(@"%@",[self endOfMonthDateForMonth:12 year:2010]);
// Output: 2012-07-10 12:30:05.999 Testing App[16310:fb03] 2010-12-31 00:00:00 +0000

これは、日付を今月の最終日と同じ翌月の「0日」に設定することで機能します。(これは、翌月の初日から1日を引くのと同じことを行います。)これは、カンプが「オーバーフロー」(またはこの場合は「アンダーフロー」)を許可されdateFromComponents:、計算を自動的に行うために機能することに注意してください。

于 2012-07-10T16:07:17.473 に答える
1

注目すべき2つのこと:

  1. comps時間コンポーネントを設定する前に、のタイムゾーンを設定してみてください。私はそれをテストしていませんが、タイムゾーンを設定するときにNSDateComponentsがGMTに対して同じ時間を維持するように時間を調整している可能性があります。

  2. Core Dataストアから日付を読み戻すときに、日付をどのように解釈しているかを確認してください。

于 2012-07-10T15:37:12.497 に答える