NSDate存储的是世界标准时(UTC),输出时需要根据时区转换为本地时间 
Dates 
NSDate类提供了创建date,比较date以及计算两个date之间间隔的功能。Date对象是不可改变的。 
如果你要创建date对象并表示当前日期,你可以alloc一个NSDate对象并调用init初始化: 
view plain 
NSDate *now = [[NSDate alloc] init];

或者使用NSDate的date类方法来创建一个日期对象。如果你需要与当前日期不同的日期,你可以使用NSDate的initWithTimeInterval...或dateWithTimeInterval...方法,你也可以使用更复杂的calendar或date components对象。 
创建一定时间间隔的NSDate对象: 
view plain 
NSTimeInterval secondsPerDay = 24 * 60 * 60;

NSDate *tomorrow = [[NSDate alloc] initWithTimeIntervalSinceNow:secondsPerDay];

NSDate *yesterday = [[NSDate alloc] initWithTimeIntervalSinceNow:-secondsPerDay];

[tomorrow release]; 
[yesterday release];

使用增加时间间隔的方式来生成NSDate对象: 
view plain 
NSTimeInterval secondsPerDay = 24 * 60 * 60;

NSDate *today = [[NSDate alloc] init]; 
NSDate *tomorrow, *yesterday;

tomorrow = [today dateByAddingTimeInterval: secondsPerDay]; 
yesterday = [today dateByAddingTimeInterval: -secondsPerDay];

[today release];

如果要对NSDate对象进行比较,可以使用isEqualToDate:, compare:, laterDate:和 earlierDate:方法。这些方法都进行精确比较,也就是说这些方法会一直精确比较到NSDate对象中秒一级。例如,你可能比较两个日期,如果他们之间的间隔在一分钟之内则认为这两个日期是相等的。在这种情况下使用,timeIntervalSinceDate:方法来对两个日期进行比较。下面的代码进行了示例: 
view plain 
if (fabs([date2 timeIntervalSinceDate:date1]) < 60) ...

NSCalendar & NSDateComponents 
日历对象封装了对系统日期的计算,包括这一年开始,总天数以及划分。你将使用日历对象对绝对日期与date components(包括年,月,日,时,分,秒)进行转换。 
NSCalendar定义了不同的日历,包括佛教历,格里高利历等(这些都与系统提供的本地化设置相关)。NSCalendar与NSDateComponents对象紧密相关。 
你可以通过NSCalendar对象的currentCalendar方法来获得当前系统用户设置的日历。 
view plain 
NSCalendar *currentCalendar = [NSCalendar currentCalendar];

NSCalendar *japaneseCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSJapaneseCalendar];

NSCalendar *usersCalendar = [[NSLocale currentLocale] objectForKey:NSLocaleCalendar]; 
usersCalendar和currentCalendar对象是相等的,尽管他们是不同的对象。 
你可以使用NSDateComponents对象来表示一个日期对象的组件——例如年,月,日和小时。如果要使一个NSDateComponents对象有意义,你必须将其与一个日历对象相关联。下面的代码示例了如何创建一个NSDateComponents对象: 
view plain 
NSDateComponents *components = [[NSDateComponents alloc] init];

[components setDay:6]; 
[components setMonth:5]; 
[components setYear:2004];

NSInteger weekday = [components weekday]; // Undefined (== NSUndefinedDateComponent)

要将一个日期对象解析到相应的date components,你可以使用NSCalendar的components:fromDate:方法。此外日期本身,你需要指定NSDateComponents对象返回组件。 
view plain 
NSDate *today = [NSDate date];

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDateComponents *weekdayComponents = [gregorian components:(NSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:today];

NSInteger day = [weekdayComponents day]; 
NSInteger weekday = [weekdayComponents weekday];

同样你也可以从NSDateComponents对象来创建NSDate对象: 
NSDateComponents *components = [[NSDateComponents alloc] init];

[components setWeekday:2]; // Monday 
[components setWeekdayOrdinal:1]; // The first Monday in the month 
[components setMonth:5]; // May 
[components setYear:2008];

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDate *date = [gregorian dateFromComponents:components];

为了保证正确的行为,您必须确保使用的组件在日历上是有意义的。指定“出界”日历组件,如一个-6或2月30日在公历中的日期值产生未定义的行为。 
你也可以创建一个不带年份的NSDate对象,这样的操作系统会自动生成一个年份,但在后面的代码中不会使用其自动生成的年份。 
view plain 
NSDateComponents *components = [[NSDateComponents alloc] init];

[components setMonth:11]; 
[components setDay:7];

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDate *birthday = [gregorian dateFromComponents:components];

下面的示例显示了如何从一个日历置换到另一个日历: 
view plain 
NSDateComponents *comps = [[NSDateComponents alloc] init];

[comps setDay:6]; 
[comps setMonth:5]; 
[comps setYear:2004];

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDate *date = [gregorian dateFromComponents:comps];

[comps release]; 
[gregorian release];

NSCalendar *hebrew = [[NSCalendar alloc] initWithCalendarIdentifier:NSHebrewCalendar];

NSUInteger unitFlags = NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit;

NSDateComponents *components = [hebrew components:unitFlags fromDate:date];

NSInteger day = [components day]; // 15 
NSInteger month = [components month]; // 9 
NSInteger year = [components year]; // 5764

历法计算 
在当前时间加上一个半小时: 
view plain 
NSDate *today = [[NSDate alloc] init];

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];

[offsetComponents setHour:1]; 
[offsetComponents setMinute:30];

// Calculate when, according to Tom Lehrer, World War III will end 
NSDate *endOfWorldWar3 = [gregorian dateByAddingComponents:offsetComponents toDate:today options:0];

获得当前星期中的星期天(使用格里高利历): 
view plain 
NSDate *today = [[NSDate alloc] init];

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

// Get the weekday component of the current date 
NSDateComponents *weekdayComponents = [gregorian components:NSWeekdayCalendarUnit fromDate:today];

/* 
Create a date components to represent the number of days to subtract from the current date.

The weekday value for Sunday in the Gregorian calendar is 1, so subtract 1 from the number of days to subtract from the date in question. (If today is Sunday, subtract 0 days.) 
*/

NSDateComponents *componentsToSubtract = [[NSDateComponents alloc] init];

[componentsToSubtract setDay: 0 - ([weekdayComponents weekday] - 1)];

NSDate *beginningOfWeek = [gregorian dateByAddingComponents:componentsToSubtract toDate:today options:0];

/* 
Optional step: 
beginningOfWeek now has the same hour, minute, and second as the original date (today).

To normalize to midnight, extract the year, month, and day components and create a new date from those components. 
*/

NSDateComponents *components = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate: beginningOfWeek];

beginningOfWeek = [gregorian dateFromComponents:components]; 
如何可以计算出一周的第一天(根据系统的日历设置): 
view plain 
NSDate *today = [[NSDate alloc] init];

NSDate *beginningOfWeek = nil;

BOOL ok = [gregorian rangeOfUnit:NSWeekCalendarUnit startDate:&beginningOfWeek interval:NULL forDate: today];

获得两个日期之间的间隔: 
view plain 
NSDate *startDate = ...; 
NSDate *endDate = ...;

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSUInteger unitFlags = NSMonthCalendarUnit | NSDayCalendarUnit;

NSDateComponents *components = [gregorian components:unitFlags fromDate:startDate toDate:endDate options:0];

NSInteger months = [components month]; 
NSInteger days = [components day]; 
使用Category来计算同一时代(AD|BC)两个日期午夜之间的天数: 
view plain 
@implementation NSCalendar (MySpecialCalculations)

-(NSInteger)daysWithinEraFromDate:(NSDate *) startDate toDate:(NSDate *) endDate { 
NSInteger startDay=[self ordinalityOfUnit:NSDayCalendarUnit inUnit: NSEraCalendarUnit forDate:startDate];

NSInteger endDay=[self ordinalityOfUnit:NSDayCalendarUnit inUnit: NSEraCalendarUnit forDate:endDate];

return endDay-startDay; 
}

@end

使用Category来计算不同时代(AD|BC)两个日期的天数: 
view plain 
@implementation NSCalendar (MyOtherMethod)

-(NSInteger) daysFromDate:(NSDate *) startDate toDate:(NSDate *) endDate {

NSCalendarUnit units=NSEraCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;

NSDateComponents *comp1=[self components:units fromDate:startDate]; 
NSDateComponents *comp2=[self components:units fromDate endDate];

[comp1 setHour:12]; 
[comp2 setHour:12];

NSDate *date1=[self dateFromComponents: comp1]; 
NSDate *date2=[self dateFromComponents: comp2];

return [[self components:NSDayCalendarUnit fromDate:date1 toDate:date2 options:0] day]; 
}

@end

判断一个日期是否在当前一周内(使用格里高利历): 
view plain 
-(BOOL)isDateThisWeek:(NSDate *)date {

NSDate *start; 
NSTimeInterval extends;

NSCalendar *cal=[NSCalendar autoupdatingCurrentCalendar]; 
NSDate *today=[NSDate date];

BOOL success= [cal rangeOfUnit:NSWeekCalendarUnit startDate:&start interval: &extends forDate:today];

if(!success) 
return NO;

NSTimeInterval dateInSecs = [date timeIntervalSinceReferenceDate]; 
NSTimeInterval dayStartInSecs= [start timeIntervalSinceReferenceDate];

if(dateInSecs > dayStartInSecs && dateInSecs < (dayStartInSecs+extends)){ 
return YES; 

else { 
return NO; 

}

NSDate的运算的更多相关文章

  1. 【Objective-C】NSDate详解及获取当前时间等常用操作

    NSDate类用于保存时间值,同时提供了一些方法来处理一些基于秒级别时差(Time Interval)运算和日期之间的早晚比较等. 1. 创建或初始化可用以下方法 用于创建NSDate实例的类方法有 ...

  2. NSDatePicker && NSDate

    UIDatePicker *datePicker = [[UIDatePicker alloc]init]; datePicker.datePickerMode = UIDatePickerModeD ...

  3. NSDate详解及获取当前时间等常用操作

    NSDate类用于保存时间值,同时提供了一些方法来处理一些基于秒级别时差(Time Interval)运算和日期之间的早晚比较等. 1. 创建或初始化可用以下方法 用于创建NSDate实例的类方法有 ...

  4. NSDate常用代码范例

    NSDate常用代码范例 NSDate类用于保存时间值,同时提供了一些方法来处理一些基于秒级别时差(Time Interval)运算和日期之间的早晚比较等. 1. 创建或初始化可用以下方法 用于创建N ...

  5. 获取时间【NSDate】

    [Objective-C]NSDate详解及获取当前时间等常用操作 博客分类: Objective-C objective-cnsdate  NSDate类用于保存时间值,同时提供了一些方法来处理一些 ...

  6. Foundation框架—时间处理对象NSDate

    NSDate类用于保存时间值,同时提供了一些方法来处理一些基于秒级别时差(Time Interval)运算和日期之间的早晚比较等. 1. NSDate的构造方法和构造获取实例的属性 用于创建NSDat ...

  7. NSDate 问题

    类型 比特数 有效数字 数值范围 float 32 6-7 -3.4*10(-38)-3.4*10(38) double 64 15-16 -1.7*10(-308)-1.7*10(308) long ...

  8. PHP赋值运算

    1. 赋值运算:= ,意思是右边表达式的值赋给左边的运算数. $int1=10; $int1=$int1-6; //$int1=4 echo $int1,"<br>"; ...

  9. javascript中的浮点数运算

    解释一下下面代码的输出 console.log(0.1 + 0.2); //0.30000000000000004 console.log(0.1 + 0.2 == 0.3); //false Jav ...

随机推荐

  1. Joke

    你忍心蜗居在不到10平米的小屋里吗?你忍心看着自己的女友和你奋斗一辈子还供不起一套房吗?你忍心看着你父母缩衣节食把仅有的一点养老金帮你还房贷吗? 这里才是实现你梦想的地方.加入我们,待遇从优,装备齐全 ...

  2. Corelocation及地图控件学习笔记

    Corelocation基本使用 在地图章节的学习中,首先要学的便是用户位置定位,因此我们首先要掌握Corelocation的使用.(在IOS8以前可以系统会直接请求授权,现在需要我们自己调用方式通知 ...

  3. linux清空文件等有用的指令

    1).    > filename 2).    :> filename 3).   echo "" > filename  (文件大小被截为1字节) 4).   ...

  4. (四)ubuntu学习前传—uboot中对Flash和DDR的管理

    1.uboot阶段Flash的分区 (1)所谓分区,就是说对Flash进行分块管理.(2)PC机等产品中,因为大家都是在操作系统下使用硬盘的,整个硬盘由操作系统统一管理,操作系统会使用文件系统帮我们管 ...

  5. synchronized与static synchronized 的区别

    synchronized是对类的当前实例加锁,防止其他线程同时访问该类的该实例的synchronized块,这里的概念是“类的当前实例”,而static synchronized是对类的所有实例加锁, ...

  6. Android控件之ImageView(显示图片的控件)

    一.ImageView属性: android:src = "@drawable/ic_launcher"——ImageView的内容图像(可以和android:background ...

  7. JAVA EE 第一阶段项目问题

    一: 乱码 原因: 由于同组的其他同学的myeclipse默认的编码方式是GBK,而我的默认的是UTF-8.所以当我使用svn把其他同学提交到组长那里去的代码下载下来的时候,就全乱码了! 解决问题: ...

  8. hiho_1044 状态压缩

    题目大意 给定N个位置,每个位置i都有一个value[i]值,从中选择若干个位置,使得连续的M个位置中的被选中的位置数目不超过Q,求出所有选择方案中value和最大的方案,输出其最大value和. 分 ...

  9. 【转】 Live555

    Ⅰ live555简介 Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SIP等的支持.Live555实现了对多种音视频编 ...

  10. 使用XIB实现一个简单view

    技术处女贴 欢迎来探讨 转帖请注明出处 http://www.cnblogs.com/andy-zhou/p/4962135.html 微信: @Andy 1. AppDelegate AppDele ...