0

はい、これはNSDate の開始日と終了日に似ていますが、そのトピックでは、私がここで求めているすべての状況で機能するかどうかについては説明していません。その質問は、NSDayCalendarUnit を忘れたために正しい値を返さないことに対処しました。この質問は、私が思っていたように DST で機能しないことが判明した値の精度を扱っています。

私のアプリのいくつかの部分では、実際の日付を気にせずに時刻を指定する必要があります。たとえば、毎日午後 4 時にこのアクティビティを実行します。これを行う方法について説明している投稿をいくつか見ましたが、私のアプローチについてフィードバックをお願いします。以下のメソッドは、特定の日の午前 0 時を返すことを目的としており、特定の時刻までの秒数を表すオフセット (たとえば、午前 1:00:00 を 3600 として表す) と組み合わせて使用​​されます。

うまくいくと思いますが、夏時間などの特殊なケースを処理できるかどうかに興味があります。フィードバックをいただければ幸いです。ありがとう!

// We want to return 12:00:00AM of the day represented by the time interval
NSTimeInterval getStartOfDay(NSTimeInterval t)
{
   // first convert the time interval to an NSDate
   NSDate *ourStartingDate = [NSDate dateWithTimeIntervalSinceReferenceDate:t] ;

   // get just the year, month, and day of our date
   unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
   NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
   NSDateComponents *comps = [gregorian components:unitFlags fromDate:ourStartingDate];
   NSDate *ourConvertedDate = [gregorian dateFromComponents:comps] ;

   // put that date into a time interval
   NSTimeInterval convertedInterval = [ourConvertedDate timeIntervalSinceReferenceDate] ;

   // because the time interval is in GMT and we may not be, we need to get an offset
   NSInteger timeZoneOffset = [[NSTimeZone localTimeZone ] secondsFromGMT] ;

   // account for the time zone difference
   convertedInterval = convertedInterval - timeZoneOffset ;

   // still might have a Daylight Savings Time issue?
   return convertedInterval ;
}
4

1 に答える 1