Foundation框架中的日期操作总结

Posted talk_8

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Foundation框架中的日期操作总结相关的知识,希望对你有一定的参考价值。

看官们,我们在前面章回中介绍了Foundation框架中的NSCalendar,本章回中将介绍Foundation框架中的日期操作做总结。


日期操作主要涉及NSDate、NSDateFormatter和NSCalendar三个大类以及NSLocale、NSTimeZone和NSDateComponents三个小类。我们在前面章回中详细介绍过这些类以及类中经常使用的方法,本章回中将从日期操作的角度来对这些类做一个整体的总结:

  • 1.程序中对日期的操作都是通过NSDate类进行的,它是日期操作的核心类;
  • 2.程序中需要直观的字符类型(NSString)时需要使用NSDateFormatter类来转换NSDate对象;
  • 3.NSDateFormatter类可以提供符合程序需求的各种格式的日期,当然要注意地区和时区的差异;
  • 3.NSDateFormatter类中对于地区和时区的差异通过NSLocale和NSTimeZone这两个类的相关操作来完成;
  • 4.程序中对日期和时间单元的操作通过NSCalendar类和它的辅助类NSDateComponents来完成,需要掌握类的中相关方法;


最近几个章回的内容都偏重于理论的,接下来我们通过具体的代码来演示使用操作日期:

#include<Foundation/Foundation.h>

int main() 
    //获取日期和时间
    NSDate *date1 = [NSDate date];
    NSDate *date2 = [[NSDate alloc] init];
    NSDate *date3 = [NSDate dateWithTimeIntervalSinceNow:3600*2];

    NSLog(@"date1: %@",date1);
    NSLog(@"date2: %@",date2);
    NSLog(@"date3: %@",date3);

    //计算日期和时间的差,时间差本质是double类型,单位是秒
    NSLog(@"date3 - date2: %f", [date3 timeIntervalSinceDate:date2]);
    NSLog(@"date2 - date3: %f", [date2 timeIntervalSinceDate:date3]);
    // NSLog(@"China date: %@",[date descriptionWithLocale:@"cn"]);
    // NSLog(@"China date: %@",[date descriptionWithLocale:@"en_US"]);

    //比较日期和时间
    switch([ date1 compare: date3]) 
        case NSOrderedSame:
            NSLog(@" date1 == date3");
        break;
        case NSOrderedDescending:
            NSLog(@" date1 > date3");
        break;
        case NSOrderedAscending:
            NSLog(@" date1 < date3");
        break;
        default:
        break;
    

    //使用NSDateFormatter把当前地区的日期和时间转换为指定地区和日期和时间(NSDate转换成NSString)
    //注意步骤:先创建formater然后指定style,最后是输出string.不指定style无法输出string
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    // dateFormat.dateStyle = NSDateFormatterFullStyle;
    // dateFormat.timeStyle = NSDateFormatterFullStyle;
    dateFormat.dateStyle = NSDateFormatterMediumStyle;
    dateFormat.timeStyle = NSDateFormatterMediumStyle;
    // dateFormat.dateStyle = NSDateFormatterShortStyle;
    // dateFormat.timeStyle = NSDateFormatterShortStyle;


    //列出当前系统支持的时区格式,看城市名字就可以知道是哪个国家的时区
    // NSLog(@"tiemeZone %@",[NSTimeZone knownTimeZoneNames]);
    //获取当前系统所在时区的名称
    // NSLog(@"tiemeZone: %@", [NSTimeZone name]);

    //列出的local都是en_US这样的,不知道具体代表哪个国家
     // NSLog(@"locale: %@",[NSLocale availableLocaleIdentifiers]);

    //设置地区为控件日期和时间和格式,设置时区来控制时间
    dateFormat.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
    dateFormat.timeZone = [[NSTimeZone alloc] initWithName:@"America/New_York"];
    NSLog(@"us date: %@",[dateFormat stringFromDate:date1]);

    // UTC或者UTC+/-时差, 这样很方便,省得记名字
    dateFormat.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"];
    dateFormat.timeZone = [[NSTimeZone alloc] initWithName:@"UTC+1"];
    NSLog(@"fr date: %@",[dateFormat stringFromDate:date1]);

    dateFormat.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_GB"];
    dateFormat.timeZone = [[NSTimeZone alloc] initWithName:@"Asia/Shanghai"];
    NSLog(@"zh date: %@",[dateFormat stringFromDate:date1]);

    //自定义格式不是很好用,完整的格式是 yyyyMMdd hh:mm:ss,H大写是24小时格式,小写会显示am/pm,yy表示年没有20,可以只有月和日,格式为MMdd
    dateFormat.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_GB"];
    [dateFormat setLocalizedDateFormatFromTemplate:@"yyyyMMdd  HH:mm:ss"];
    NSLog(@"DIY formate date: %@",[dateFormat stringFromDate:date1]);


    //locale与格式都要保持一致才可以获取到日期,我举两个例子才得出的规律,en和ch两个日期格式
    //使用NSDateFormatter把特定的日期和时间转换为指定地区和日期和时间(NSString转换成NSDate)
    NSString *strDate = @"2021-11-13 16:27:00";
    dateFormat.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_GB"];
    [dateFormat setLocalizedDateFormatFromTemplate:@"yyyyMMdd HH:mm:ss"];
    NSLog(@"date of String: %@",[dateFormat dateFromString:strDate]);

    dateFormat.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
    [dateFormat setLocalizedDateFormatFromTemplate:@"MMddyy, HH:mm:ss"];
    strDate = @"11-13-21, 16:27:00";
    NSLog(@"date of String: %@",[dateFormat dateFromString:strDate]);


    NSCalendar * calendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSCalendarIdentifierGregorian];
    // NSCalendar * calendar = [NSCalendar currentCalendar];
    NSDateComponents *components = [[NSDateComponents alloc] init];
    // components.year = 2021;
    // components.month = 12;
    // [components setDay:5];

    [components setValue:2021 forComponent:NSCalendarUnitYear];
    [components setValue:8 forComponent:NSCalendarUnitMonth];
    [components setValue:21 forComponent:NSCalendarUnitDay];
    [components setValue:16 forComponent:NSCalendarUnitHour];
    //合并操作
    NSDate *date4 = [calendar dateFromComponents:components];
    //输出日期时对时间做了时区转换操作,合并日期和时间单元时没有时区转换操作
    NSLog(@"new date: %@, Hour:%ld",date4,components.hour);

    //分析操作,在这里分析了年月日和时分,没有分解秒
    NSCalendarUnit unitFlags = NSCalendarUnitMonth|NSCalendarUnitYear|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute;
    components = [calendar components: unitFlags fromDate:date2];
    NSLog(@"components: %@",components);
    NSLog(@"Year: %ld,Month:%ld,Day:%ld,- H:%ld, M:%ld, S:%ld",components.year,components.month,
        components.day,components.hour,components.minute,components.second);


在代码中我们添加了相关的注释,以方便大家理解代码。程序中的内容比较多,希望大家结合前面章回的内容一边动手是运行程序,一边分析代码,特别是地区和时区的差异。


看官们,本章回的内容就介绍到这里,欲知后事如何且听下回分解!

以上是关于Foundation框架中的日期操作总结的主要内容,如果未能解决你的问题,请参考以下文章

Foundation框架中的NSDate

Foundation框架中的NSDateFormatter

Foundation框架知识总结

Foundation框架时间操作

Foundation框架中的NSCalendar

Foundation框架 之 常见结构体包装数据日期