1、NSDateFormatter调整时间格式的代码

在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理。
例如:

//实例化一个NSDateFormatter对象
 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

 //设定时间格式,这里可以设置成自己需要的格式
 [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

 //用[NSDate date]可以获取系统当前时间
 NSString *currentDateStr = [dateFormatter stringFromDate:[NSDate date]];

 //输出格式为:2010-10-27 10:22:13
 NSLog(@”%@”,currentDateStr);

 //alloc后对不使用的对象别忘了release
 [dateFormatter release];

2、NSCalendar + NSDateComponents

历法能使人类确定每一日再无限的时间中的确切位置并记录历史。

  1. 日历,历法,一般历法都是遵循固定的规则的,具有周期性。日历都是已知的或可预测的。
  2. 任何一种具体的历法,首先必须明确规定起始点,即开始计算的年代,这叫“纪元”;以及规定一年的开端,这叫“岁首”。此外,还要规定每年所含的日数,如何划分月份,每月有多少天等等。
  3. NSCalendar对世界上现存的常用的历法进行了封装,既提供了不同历法的时间信息,又支持日历的计算。
  4. NSDateFomatter表示的时间默认以公历(即阳历)为参考,可以通过设置calendar属性变量获得特定历法下的时间表示。
  5. NSDate是独立与任何历法的,它只是时间相对于某个时间点的时间差;NSDate是进行日历计算的基础。
  6. NSDateComponents将时间表示成适合人类阅读和使用的方式,通过NSDateComponents可以快速而简单地获取某个时间点对应的“年”,“月”,“日”,“时”,“分”,“秒”,“周”等信息。当然一旦涉及了年月日时分秒就要和某个历法绑定,因此NSDateComponents必须和NSCalendar一起使用,默认为公历。
  7. NSDateComponents除了像上面说的表示一个时间点外,还可以表示时间段,例如:两周,三个月,20年,7天,10分钟,50秒等等。时间段用于日历的计算,例如:获取当前历法下,三个月前的某个时间点。
  8. 可以说,要获取某个时间点在某个历法下的表示,需要NSDateComponents;要计算当前时间点在某个历法下对应的一个时间段前或后的时间点,需要NSDateComponents。
  9. NSDateComponents返回的day, week, weekday, month, year这一类数据都是从1开始的。因为日历是给人看的,不是给计算机看的,从0开始就是个错误。

 NSDateComponents

   NSDateComponents封装在一个可扩展的,面向对象的方式的日期组件。它是用来弥补时间的日期和时间组件提供一个指定日期:小时,分钟,秒,日,月,年,等等。它也可以用来指定的时间,例如,5小时16分钟。一个NSDateComponents对象不需要定义所有组件领域。当一个NSDateComponents的新实例被创建,日期组件被设置为NSUndefinedDateComponent。

NSDateComponents对象本身是毫无意义的;你需要知道它是针对什么日历解释,你需要知道它的值是否是正整数和值是多少。

  NSDateComponents的实例不负责回答关于一个日期以外的信息,它是需要先初始化的。例如,如果你初始化一个对象为2004年5月6日,其星期几NSUndefinedDateComponent,不是星期四。要得到正确的星期几,你必须创建一个NSCalendar日历实例,创建一个NSDate对象并使用dateFromComponents:方法,然后使用components:fromDate:检索.


NSDateComponents实例化的方式

首先初始化一个NSCalender类,

//  先定义一个遵循某个历法的日历对象
   NSCalendar *greCalendar = [[NSCalendar alloc]  initWithCalendarIdentifier:NSGregorianCalendar];




第一种:

  

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~first method
    //   通过已定义的日历对象,获取某个时间点的NSDateComponents表示,并设置需要表示哪些信息(NSYearCalendarUnit, NSMonthCalendarUnit, NSDayCalendarUnit等)
    NSDateComponents *dateComponents = [greCalendarcomponents:NSYearCalendarUnit |NSMonthCalendarUnit | NSDayCalendarUnit |NSHourCalendarUnit | NSMinuteCalendarUnit |NSSecondCalendarUnit | NSWeekCalendarUnit |NSWeekdayCalendarUnit | NSWeekOfMonthCalendarUnit |NSWeekOfYearCalendarUnit fromDate:[NSDatedate]];
NSLog(@"year(年份): %i", dateComponents.year);
NSLog(@"quarter(季度):%i", dateComponents.quarter);
NSLog(@"month(月份):%i", dateComponents.month);
NSLog(@"day(日期):%i", dateComponents.day);
NSLog(@"hour(小时):%i", dateComponents.hour);
NSLog(@"minute(分钟):%i", dateComponents.minute);
NSLog(@"second(秒):%i", dateComponents.second);
    //获取该天是星期几。
NSLog(@"weekday(星期):%i", dateComponents.weekday);
    //   苹果官方不推荐使用week
NSLog(@"week(该年第几周):%i", dateComponents.week);
NSLog(@"weekOfYear(该年第几周):%i", dateComponents.weekOfYear);
NSLog(@"weekOfMonth(该月第几周):%i", dateComponents.weekOfMonth);

输出结果:

    

2014-07-14 11:57:32.416 dateCalender[1343:60b] year(年份): 2014
2014-07-14 11:57:32.417 dateCalender[1343:60b] quarter(季度):2147483647
2014-07-14 11:57:32.417 dateCalender[1343:60b] month(月份):7
2014-07-14 11:57:32.418 dateCalender[1343:60b] day(日期):14
2014-07-14 11:57:32.418 dateCalender[1343:60b] hour(小时):11
2014-07-14 11:57:32.419 dateCalender[1343:60b] minute(分钟):57
2014-07-14 11:57:32.419 dateCalender[1343:60b] second(秒):32
2014-07-14 11:57:32.419 dateCalender[1343:60b] weekday(星期):2
2014-07-14 11:57:32.420 dateCalender[1343:60b] week(该年第几周):29
2014-07-14 11:57:32.420 dateCalender[1343:60b] weekOfYear(该年第几周):29
2014-07-14 11:57:32.421 dateCalender[1343:60b] weekOfMonth(该月第几周):3


第二种:


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ second method
    //   定义一个NSDateComponents对象,设置一个时间点为2014年5月6号12:30:12
NSDateComponents *dateComponentsForDate = [[NSDateComponentsalloc] init];
setDay:6];
setMonth:5];
setYear:2014];
setHour:12];
setMinute:30];
setSecond:12];
    //   根据设置的dateComponentsForDate获取历法中与之对应的时间点
    //   这里的时分秒会使用NSDateComponents中规定的默认数值,一般为0或1。
NSDate *dateFromDateComponentsForDate = [greCalendardateFromComponents:dateComponentsForDate];
    NSDateComponents *dateComponents1 = [greCalendarcomponents:NSYearCalendarUnit |NSMonthCalendarUnit | NSDayCalendarUnit |NSHourCalendarUnit | NSMinuteCalendarUnit |NSSecondCalendarUnit | NSWeekCalendarUnit |NSWeekdayCalendarUnit | NSWeekOfMonthCalendarUnit |NSWeekOfYearCalendarUnit fromDate:dateFromDateComponentsForDate];
NSLog(@"year(年份): %i", dateComponents1.year);
NSLog(@"quarter(季度):%i", dateComponents1.quarter);
NSLog(@"month(月份):%i", dateComponents1.month);
NSLog(@"day(日期):%i", dateComponents1.day);
NSLog(@"hour(小时):%i", dateComponents1.hour);
NSLog(@"minute(分钟):%i", dateComponents1.minute);
NSLog(@"second(秒):%i", dateComponents1.second);
     
    //   定义一个NSDateComponents对象,设置一个时间段
NSDateComponents *dateComponentsAsTimeQantum = [[NSDateComponentsalloc] init];
setDay:6];
NSLog(@"year(年份): %i", dateComponentsAsTimeQantum.year);
NSLog(@"quarter(季度):%i", dateComponentsAsTimeQantum.quarter);
NSLog(@"month(月份):%i", dateComponentsAsTimeQantum.month);
NSLog(@"day(日期):%i", dateComponentsAsTimeQantum.day);
NSLog(@"hour(小时):%i", dateComponentsAsTimeQantum.hour);
NSLog(@"minute(分钟):%i", dateComponentsAsTimeQantum.minute);
NSLog(@"second(秒):%i", dateComponentsAsTimeQantum.second);

    // 在当前历法下,获取6天后的时间点

NSDate *dateFromDateComponentsAsTimeQantum = [greCalendardateByAddingComponents:dateComponentsAsTimeQantumtoDate:[NSDatedate] options:0];
    NSDateComponents *dateComponents2 = [greCalendarcomponents:NSYearCalendarUnit |NSMonthCalendarUnit | NSDayCalendarUnit |NSHourCalendarUnit | NSMinuteCalendarUnit |NSSecondCalendarUnit | NSWeekCalendarUnit |NSWeekdayCalendarUnit | NSWeekOfMonthCalendarUnit |NSWeekOfYearCalendarUnit fromDate:dateFromDateComponentsAsTimeQantum];
 
NSLog(@"year(年份): %i", dateComponents2.year);
NSLog(@"quarter(季度):%i", dateComponents2.quarter);
NSLog(@"month(月份):%i", dateComponents2.month);
NSLog(@"day(日期):%i", dateComponents2.day);
NSLog(@"hour(小时):%i", dateComponents2.hour);
NSLog(@"minute(分钟):%i", dateComponents2.minute);
NSLog(@"second(秒):%i", dateComponents2.second);



输出结果:

    

2014-07-14 11:57:32.421 dateCalender[1343:60b] year(年份): 2014
2014-07-14 11:57:32.422 dateCalender[1343:60b] quarter(季度):2147483647
2014-07-14 11:57:32.422 dateCalender[1343:60b] month(月份):5
2014-07-14 11:57:32.422 dateCalender[1343:60b] day(日期):6
2014-07-14 11:57:32.423 dateCalender[1343:60b] hour(小时):12
2014-07-14 11:57:32.423 dateCalender[1343:60b] minute(分钟):30
2014-07-14 11:57:32.424 dateCalender[1343:60b] second(秒):12

2014-07-14 11:57:32.424 dateCalender[1343:60b] year(年份): 2147483647
2014-07-14 11:57:32.429 dateCalender[1343:60b] quarter(季度):2147483647
2014-07-14 11:57:32.430 dateCalender[1343:60b] month(月份):2147483647
2014-07-14 11:57:32.430 dateCalender[1343:60b] day(日期):6
2014-07-14 11:57:32.431 dateCalender[1343:60b] hour(小时):2147483647
2014-07-14 11:57:32.431 dateCalender[1343:60b] minute(分钟):2147483647
2014-07-14 11:57:32.432 dateCalender[1343:60b] second(秒):2147483647
2014-07-14 11:57:32.432 dateCalender[1343:60b] year(年份): 2014
2014-07-14 11:57:32.432 dateCalender[1343:60b] quarter(季度):2147483647
2014-07-14 11:57:32.433 dateCalender[1343:60b] month(月份):7
2014-07-14 11:57:32.433 dateCalender[1343:60b] day(日期):20
2014-07-14 11:57:32.434 dateCalender[1343:60b] hour(小时):11
2014-07-14 11:57:32.434 dateCalender[1343:60b] minute(分钟):57
2014-07-14 11:57:32.435 dateCalender[1343:60b] second(秒):32



第三种:

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~third method
    // 根据两个时间点,定义NSDateComponents对象,从而获取这两个时间点的时差
    NSDateComponents *dateComponents3 = [greCalendarcomponents:NSYearCalendarUnitfromDate:[NSDatedateWithTimeIntervalSince1970:0]toDate:[NSDatedate] options:0];
NSLog(@"number of years:%i", dateComponents3.year);



输出结果:



2014-07-14 11:57:32.435 dateCalender[1343:60b] number of years:44