iOS:日历和时间


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的实例不负责回答关于一个日期以外的信息,它是需要先初始化的。例如,如果你初始化一个对象为200456日,其星期几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);

    //获取该天是星期几。 Sunday:1, Monday:2, Tuesday:3, Wednesday:4, Friday:5, Saturday:6

   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对象,设置一个时间点为20145612:30:12

   NSDateComponents *dateComponentsForDate = [[NSDateComponentsalloc] init];

    [dateComponentsForDatesetDay:6];

    [dateComponentsForDatesetMonth:5];

    [dateComponentsForDatesetYear:2014];

    [dateComponentsForDatesetHour:12];

    [dateComponentsForDatesetMinute:30];

    [dateComponentsForDatesetSecond:12];

    //  根据设置的dateComponentsForDate获取历法中与之对应的时间点

    //  这里的时分秒会使用NSDateComponents中规定的默认数值,一般为01

   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];

    [dateComponentsAsTimeQantumsetDay: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






  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值