3
給定NSDate
和NSCalendar
,如何確定指定日期之後當天的小時數。取決於下一天是進入夏令時(23),正常(24)還是現在的夏令時(25),這將是23,24或25。確定給定日期(加或減DST班次小時數)的小時數
給定NSDate
和NSCalendar
,如何確定指定日期之後當天的小時數。取決於下一天是進入夏令時(23),正常(24)還是現在的夏令時(25),這將是23,24或25。確定給定日期(加或減DST班次小時數)的小時數
你可以問日曆中的任意單元有多長(和單位開始時)與rangeOfUnit:startDate:interval:forDate:
。
// Test date (the day DST begins)
NSDateComponents *components = [[NSDateComponents alloc] init];
components.year = 2012;
components.month = 3;
components.day = 11;
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [calendar dateFromComponents:components];
NSTimeInterval dayLength;
[calendar rangeOfUnit:NSDayCalendarUnit startDate:NULL interval:&dayLength forDate:date];
NSLog(@"%f seconds", dayLength);
注意rangeOfUnit:...
可以techincally失敗並返回NO
,但如果控制不應該是能夠發生的輸入。
// Test input
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy MM dd HH:mm:ss";
NSDate *referenceDate = [formatter dateFromString:@"2012 03 24 13:14:14"];
// Get reference date with day precision
NSCalendar *calendar = [NSCalendar currentCalendar];
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents *components = [calendar components:unitFlags fromDate:referenceDate];
NSDate *today = [calendar dateFromComponents:components];
// Set components to add 1 day
components = [[NSDateComponents alloc] init];
components.day = 1;
// The day after the reference date
NSDate *tomorrow = [calendar dateByAddingComponents:components toDate:today options:0];
// The day after that
NSDate *afterTomorrow = [calendar dateByAddingComponents:components toDate:tomorrow options:0];
// Difference in hours: 23, 24 or 25
NSUInteger hours = [afterTomorrow timeIntervalSinceDate:tomorrow]/3600;
看一看[「確定時域的區別」(https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/DatesAndTimes/Articles/dtCalendricalCalculations.html#//apple_ref/doc/uid/TP40007836-SW8)的日期和時間編程指南。 – 2012-02-24 19:32:28