zoukankan      html  css  js  c++  java
  • iOS中处理时间的类及使用

    iOS中处理时间的类及使用

    1. NSDate这个类就是生成一个date
    如果你用[NSDate date]这个最最常用的方法你可以得到系统当前的时间(UTC时间,不管你当前时区的)
    比如:
    NSDate *date = [NSDate date];
    NSLog(@"%@", date);
    输出:
    2013-04-27 07:25:59 +0000

    在类的头文件NSDate.h中,我们可以看到所有的方法和类方法,但没有任何一个数据,所以我们可以打印出时间的字符串,但没办法单独去获得年、月、日等信息。
    在苹果的官方文档上说这个类用来描述一个特定的时间点,也就是说可以记录一个瞬间的时间点,然后这个数据是不能修改的。
    这个类提供方法来获得时间(过去,当前,未来都可以),计算两个时间之间的间隔,比较时间,描述时间内容

    2. NSDateFormatter
    顾名思义,这个类是描述date的打印显示格式,是配合NSDate类工作的。
    因为不同地域习惯的格式不同,用户也会设置不同的格式,所以iOS提供了很丰富的设置方法,显示参数,基本上你能想到见到的方法都被一网打尽了。
    你可以设置时间显示格式,日期格式,时间格式,还有时区等等,最方便的是,你还可以设置AM/PM,月份,星期的显示内容,这点在某些特殊情形时真的非常方便(默认的功能已经非常方便了)
    – dateFormat
    – setDateFormat:
    – dateStyle
    – setDateStyle:
    – timeStyle
    – setTimeStyle:

    最常用的几个方法如下:
    设置格式:
    - (void)setDateFormat:(NSString *)string;  
    打印成字符串信息:
    - (NSString *)stringFromDate:(NSDate *)date;
    设置格式模板:
    + (NSString *)dateFormatFromTemplate:(NSString *)tmplate options:(NSUInteger)opts locale:(NSLocale *)locale NS_AVAILABLE(10_6, 4_0);


    关于DateFormat的格式,先给出几个例子如下:
    NSDate *date = [NSDate date];
    NSDateFormatter *df = [[NSDateFormatter alloc] init];
    [df setDateFormat:@"dd/MM/yyyy hh:mm:ss aaa"];
    NSLog(@"curr=%@, dateFormate=%@", [df stringFromDate:date], df.dateFormat);


    变化dataFormat就可以变化时间的输出格式
    curr=27/04/2013 03:42:21 PM, dateFormate=dd/MM/yyyy hh:mm:ss aaa
    curr=02013-4月-27 公元 03:45 PM, dateFormate=yyyyy-MMMM-dd GGG hh:mm aaa
    curr=3:45 PM, 格林尼治标准时间+0800, dateFormate=K:mm a, z
    curr=03 o'clock PM,中国标准时间, dateFormate=hh 'o''clock' a,zzzz
    curr=3:46 PM, dateFormate=h:mm a
    curr=周六, 4月 27, '13 , dateFormate=EEE, MMM d, ''yy 
    curr=2013:04:27 公元 at 15:47:11 格林尼治标准时间+0800, dateFormate=yyyy:MM:dd G 'at' HH:mm:ss zzz
    这是在网上找的几个例子,如果要显示成自己希望的格式,那么还需要自己写出格式来


    + (NSString *)dateFormatFromTemplate:(NSString *)template options:(NSUInteger)opts locale:(NSLocale *)locale

    这个方法可以设置显示格式的模板,便于后面使用。

    看到这里,估计大家都会想:这个格式的设置有没有什么规律呢,或者说按照什么方法来书写呢?

    我带着这个问题搜索过,结果写在另一篇blog中《时间格式串的意义》


    3. NSDateComponents类
    这个类也没啥神秘的,就是可以得到我们比较熟悉的年月日时分秒信息,在一些计算显示场合很有用处,用NSDate类是无法单独来获得每一个元素信息的,必须使用这个NSDateComponents类。


    4. NSCalendar类
    这个类用来描述一种特定的日历。同时还提供了大部分基于时间计算的接口,并且把NSDate类和NSDateComponents类联系了起来。


    这几个类本来看着各自实现各自的功能,但是所谓的年月日等等时间信息是必须配合一种历法才能表述的,比如:同一个日子,阳历和阴历就是可能不同的几号,甚至不同的月份不同的年份
    所以当你说XXXX年XX月XX日的时候,机器一定是基于一种日历来的(最常用的当然是Gregorian历啦),所以仔细观察NSDateFormatter和NSDateComponents这两个类都有calendar这个数据成员。其中NSDateComponents这个类既有NSDate,又有NSCalendar成员。


    - (NSDateComponents *)components:(NSUInteger)unitFlags fromDate:(NSDate *)date

    根据标志,从NSDate转到NSDateComponents,这样可以获得对应的时间元素

    - (NSDateComponents *)components:(NSUInteger)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options:(NSUInteger)opts
    可以获得起始/终止时间之间的间隔,用NSDateComponents来表示

    - (NSDate *)dateByAddingComponents:(NSDateComponents *)comps toDate:(NSDate *)date options:(NSUInteger)opts
    在加上一个NSDateComponents之后返回一个NSDate的对象

    - (NSDate *)dateFromComponents:(NSDateComponents *)comps
    从NSDateComponets对象转换为NSDate对象

    具体的使用体现

    1 // 当前时间创建NSDate

            NSDate *myDate = [NSDate date];

            NSLog(@"myDate = %@",myDate);

    2 //从现在开始的24小时

            NSTimeInterval secondsPerDay = 24*60*60;

            NSDate *tomorrow = [NSDate dateWithTimeIntervalSinceNow:secondsPerDay];

            NSLog(@"myDate = %@",tomorrow);

    3//根据已有日期创建日期

             NSTimeInterval secondsPerDay1 = 24*60*60;

            NSDate *now = [NSDate date];

            NSDate *yesterDay = [now addTimeInterval:-secondsPerDay1];

            NSLog(@"yesterDay = %@",yesterDay);

     4//比较日期

            BOOL sameDate = [now isEqualToDate:yesterDay];

            NSLog(@"sameDate = %lu",sameDate);

            4.1//获取较早的日期

            NSDate *earlierDate = [yesterDay earlierDate:now];

            NSLog(@"earlierDate  = %@",earlierDate);

            4.2//较晚的日期

            NSDate *laterDate = [yesterDay laterDate:now];

            NSLog(@"laterDate  = %@",laterDate);

            //两个日期之间相隔多少秒

            NSTimeInterval secondsBetweenDates= [yesterDay timeIntervalSinceDate:now];

            NSLog(@"secondsBetweenDates=  %lf",secondsBetweenDates);

            //通过NSCALENDAR类来创建日期

            NSDateComponents *comp = [[NSDateComponentsalloc]init];

            [comp setMonth:06];

            [comp setDay:01];

            [comp setYear:2001];

            NSCalendar *myCal = [[NSCalendaralloc]initWithCalendarIdentifier:NSGregorianCalendar];

            NSDate *myDate1 = [myCal dateFromComponents:comp];

            NSLog(@"myDate1 = %@",myDate1);

            //从已有日期获取日期

            unsigned units  = NSMonthCalendarUnit|NSDayCalendarUnit|NSYearCalendarUnit;

            NSDateComponents *comp1 = [myCal components:units fromDate:now];

            NSInteger month = [comp1 month];

            NSInteger year = [comp1 year];

            NSInteger day = [comp1 day];

            //NSDateFormatter实现日期的输出

            NSDateFormatter *formatter = [[NSDateFormatteralloc]init];

            [formatter setDateStyle:NSDateFormatterFullStyle];//直接输出的话是机器码

            //或者是手动设置样式[formatter setDateFormat:@"yyyy-mm-dd"];

            NSString *string = [formatter stringFromDate:now];

            NSLog(@"string = %@",string);

            NSLog(@"formater = %@",formatter);

    //获取日期格式对象

    - (NSDateFormatter *)dateFormatter {

    if (dateFormatter == nil) {

    dateFormatter = [[NSDateFormatter alloc] init];

    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];

    [dateFormatter setTimeStyle:NSDateFormatterNoStyle];

    }

    return dateFormatter;

    }

    感谢您的访问! 若对您有帮助或有兴趣请关注博客:http://www.cnblogs.com/Rong-Shengcom/
  • 相关阅读:
    自定义类似MessageBox小窗体操作
    WinForm 遍历用户控件里CheckBox
    WinForm BaseClass类常用通用方法
    分页的几种写法
    克服粗心毛病的伪代码
    C++queue的使用
    Unix网络编程学习 < 一 >
    使用log4cxx
    memset函数
    libcurl在windows下的使用
  • 原文地址:https://www.cnblogs.com/Rong-Shengcom/p/6080548.html
Copyright © 2011-2022 走看看