美文网首页iOS经验总结
IOS开发中的时间与日期(上)

IOS开发中的时间与日期(上)

作者: 献国 | 来源:发表于2017-03-24 10:37 被阅读0次

    主要有以下几个类:

    NSDate:表示一个具体的绝对的时间点。

    NSTimeZone:表示时区信息。

    NSLocale:本地化信息。

    NSDate

    NSDate表示公历(阳历)的格林尼治(G.M.T.)时间。


    初始化方法:

    1,- (instancetype)init

    默认的初始化方法,返回当前时间,也可以直接调用+ (instancetype)date方法

    NSDate *date = [[NSDate alloc] init];

    //NSDate *date = [NSDate date];

    NSLog(@"%@",date);

    打印的结果是:2017-03-24 01:47:29 +0000  (打印的时间是格林尼治标准时间,不是我们所在的东八区时间)

    2,- (instancetype)initWithTimeIntervalSinceNow:(NSTimeInterval)secs

    以当前时间的偏移秒数来初始化,也可以直接调用+ (instancetype)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs方法

    NSDate *date = [[NSDate alloc] initWithTimeIntervalSinceNow:-88];

    NSLog(@"%@",date);

    假如当前时间为:2017-03-24 02:11:37 +0000,打印的结果是:2017-03-24 02:10:09 +0000

    3,- (instancetype)initWithTimeIntervalSince1970:(NSTimeInterval)secs

    以1970-01-01 00:00:00时间的偏移秒数来初始化,也可以直接调用+ (instancetype)dateWithTimeIntervalSince1970:(NSTimeInterval)secs

    NSDate *date = [[NSDate alloc] initWithTimeIntervalSince1970:-20];

    NSLog(@"%@",date);

    打印的结果是:1969-12-31 23:59:40 +0000

    4,- (instancetype)initWithTimeIntervalSinceReferenceDate:(NSTimeInterval)ti

    以2001-01-01 00:00:00时间的偏移秒数来初始化,也可以直接调用+ (instancetype)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)ti;

    NSDate *date = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:20];

    NSLog(@"%@",date);

    打印的结果是:2001-01-01 00:00:20 +0000

    5,- (instancetype)initWithTimeInterval:(NSTimeInterval)secsToBeAdded sinceDate:(NSDate *)date

    以参数date基准时间的偏移秒数来初始化,也可以直接调用+ (instancetype)dateWithTimeInterval:(NSTimeInterval)secsToBeAdded sinceDate:(NSDate *)date

    NSDate *currentDate = [[NSDate alloc] initWithTimeIntervalSince1970:20];

    NSLog(@"%@",currentDate);

    NSDate *date = [[NSDate alloc] initWithTimeInterval:20 sinceDate:currentDate];

    NSLog(@"%@",date);

    打印的结果是:currentDate:1970-01-01 00:00:20 +0000,    date:1970-01-01 00:00:40 +0000

    6,+(NSDate)distantPast与+(NSDate)distantFuture

    这两个是类方法,分别返回一个极早的时间点和一个极晚的时间点

    NSDate *PastDate = [NSDate distantPast];

    NSDate *futureDate = [NSDate distantFuture];

    NSLog(@"%@-%@",PastDate,futureDate);

    打印的结果:PastDate:0000-12-30 00:00:00 +0000    futureDate:4001-01-01 00:00:00 +0000


    NSDate的常用对象方法:

    1,- (instancetype)dateByAddingTimeInterval:(NSTimeInterval)ti

    返回以当前NSDate对象为基准,偏移多少秒后得到的新NSDate对象

    NSDate *currentDate = [[NSDate alloc] initWithTimeIntervalSince1970:20];

    NSLog(@"%@",currentDate);

    NSDate *date = [currentDate dateByAddingTimeInterval:20];

    NSLog(@"%@",date);

    打印的结果:currentDate:1970-01-01 00:00:20 +0000    date :1970-01-01 00:00:40 +0000,这个方法的用法与- (instancetype)initWithTimeInterval:(NSTimeInterval)secsToBeAdded sinceDate:(NSDate *)date相似。

    2,- (BOOL)isEqualToDate:(NSDate *)otherDate

    将当前日期对象与参数传递的日期对象进行比较,根据是否相同返回BOOL值

    NSDate *firstDate = [[NSDate alloc] initWithTimeIntervalSince1970:20];

    NSDate *secondDate = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:-20];

    BOOL result = [firstDate isEqualToDate:secondDate];

    NSLog(@"%d",result);

    3,- (NSDate *)earlierDate:(NSDate *)anotherDate方法与- (NSDate *)laterDate:(NSDate *)anotherDate方法

    两个日期对象比较,返回较早/较晚的那个对象。

    NSDate *firstDate = [[NSDate alloc] initWithTimeIntervalSince1970:20];

    NSDate *secondDate = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:-20];

    //  NSDate *result = [firstDate earlierDate:secondDate];

    NSDate *result = [firstDate laterDate:secondDate];

    NSLog(@"%@",result);

    4,- (NSComparisonResult)compare:(NSDate *)other

    比较两个日期对象的大小,返回值是NSComparisonResult枚举类型。

    {NSOrderedAscending (升序), NSOrderedSame(相同) ,NSOrderedDescending(降序)}

    NSDate *firstDate = [[NSDate alloc] initWithTimeIntervalSince1970:20];

    NSDate *secondDate = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:-20];

    NSComparisonResult result = [firstDate compare:secondDate];

    NSLog(@"%ld",result);

    5,- (NSTimeInterval)timeIntervalSince1970方法,- (NSTimeInterval)timeIntervalSinceReferenceDate方法,- (NSTimeInterval)timeIntervalSinceNow方法,- (NSTimeInterval)timeIntervalSinceDate:(NSDate*)anotherDate

    四个方法的含义分别是:返回当前对象时间与1970-01-01 00:00:00的相隔秒数,返回当前对象时间与2001-01-01 00:00:00的相隔秒数,返回当前时间对象与现在系统时间的相隔秒数,返回当前对象时间与参数传递的对象时间的相隔秒数,

    NSDate *currentDate = [[NSDate alloc] initWithTimeIntervalSinceNow:-20];

    NSDate *date = [[NSDate alloc] init];

    NSTimeInterval resultNow = [currentDate timeIntervalSinceNow];

    NSTimeInterval result1970 = [currentDate timeIntervalSince1970];

    NSTimeInterval result2001 = [currentDate timeIntervalSinceReferenceDate];

    NSTimeInterval result = [currentDate timeIntervalSinceDate:date];

    NSLog(@"%f+++%f+++%f+++%f",resultNow,result1970,result2001,result);

    打印结果为:-20.000006+++1490326647.182058+++512019447.182058+++-20.000003

    NSTimeZone

    NSTimeZone表示时区信息。 iOS中的时区表示方法:GMT+0800 ,GMT-0800  (+:东区 ,-:西区 ,08:小时数, 00:分钟数)。 GMT+0800 就表示 比GMT早8小时0分钟的时区。

    初始化方法:


    1,- (nullable instancetype)initWithName:(NSString *)tzName;

    根据时区名称初始化,也可以直接调用+ (nullable instancetype)timeZoneWithName:(NSString *)tzName,返回一个时区对象。

    NSTimeZone *zone = [[NSTimeZone alloc] initWithName:@"Asia/Shanghai"];

    //  NSTimeZone *zone = [NSTimeZone timeZoneWithName:@"Asia/Shanghai"];

    NSLog(@"%@",zone);

    打印结果为:Asia/Shanghai (GMT+8) offset 28800

    另外可以使用+ (NSArray *)knownTimeZoneNames方法,返回所有的时区名称。

    NSArray *timeZoneNames = [NSTimeZone knownTimeZoneNames];

    NSLog(@"%@",timeZoneNames);

    2,+ (nullable instancetype)timeZoneWithAbbreviation:(NSString *)abbreviation

    根据时区名称缩写初始化,例如HKT(香港标准时间)

    NSTimeZone *zone = [NSTimeZone timeZoneWithAbbreviation:@"HKT"];

    NSLog(@"%@",zone);

    打印结果为:Asia/Hong_Kong (GMT+8) offset 28800

    另外可以使用+ (NSDictionary*)abbreviationDictionary方法,返回所有的时区名称缩写。

    NSDictionary *dict = [NSTimeZone abbreviationDictionary];

    NSLog(@"%@",dict);

    注意:第1和第2个初始化方法,参数也可以直接传入时区,例如东八区(GMT+0800)

    NSTimeZone *zone = [NSTimeZone timeZoneWithAbbreviation:@"GMT+0800"];

    NSTimeZone *zone = [NSTimeZone timeZoneWithName:@"GMT+0800"];


    3,+ (NSTimeZone *)systemTimeZone

    返回系统的时区

    NSTimeZone *zone = [NSTimeZone systemTimeZone];

    NSLog(@"%@",zone);

    打印结果:Asia/Shanghai (GMT+8) offset 28800          ( 28800代表相对于GMT时间偏移的秒数,即8个小时,(8*60*60))

    4,+ (NSTimeZone *)localTimeZone

    返回本地的时区, 它与系统时区的区别在于,本地时区可以修改,系统时区不能修改。

    [NSTimeZone setDefaultTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"EST"]];

    NSTimeZone *localZone = [NSTimeZone localTimeZone];

    NSTimeZone *systemZone = [NSTimeZone systemTimeZone];

    NSLog(@"%@====%@",localZone,systemZone);

    打印结果:Local Time Zone (America/New_York (GMT-4) offset -14400 (Daylight))====Asia/Shanghai (GMT+8) offset 28800

    5,+ (id)timeZoneForSecondsFromGMT:(NSInteger)seconds

    根据零时区的秒数偏移返回一个新时区对象

    NSTimeZone *zone = [NSTimeZone timeZoneForSecondsFromGMT:28800];

    NSLog(@"%@",zone);

    打印结果:GMT+0800 (GMT+8) offset 28800 为东八区。

    NSTimeZone常用对象方法与类方法:


    1. - (NSString *)name 与方法 - (NSString *)abbreviation

    返回时区对象的名称或缩写

    NSTimeZone *zone = [NSTimeZone localTimeZone];

    NSString *strZoneName = [zone name];

    NSString *strZoneAbbreviation = [zone abbreviation];

    NSLog(@"name is %@",strZoneName);

    NSLog(@"abbreviation is %@",strZoneAbbreviation);

    打印:name is Asia/Shanghai    和    abbreviation is GMT+8


    2, - (NSInteger)secondsFromGMT

    得到当前时区与零时区的间隔秒数

    NSTimeZone *zone = [NSTimeZone systemTimeZone];

    NSInteger seconds = [zone secondsFromGMT];

    NSLog(@"%zd",seconds);

    NSLocale

    NSLocale类的的主要作用是用来封装本地化相关的各种信息,包括语言,货币类型,数字,日期格式等等。

    初始化方法:



    1,+ (id)currentLocale 与方法 + (id)autoupdatingCurrentLocale

    返回当前客户端的本地化信息,

    NSLocale *locale = [NSLocale currentLocale];

    NSString *localeStr = [locale localeIdentifier];

    NSLog(@"locale:%@",localeStr);

    打印:locale: zh_CN

    2,- (instancetype)initWithLocaleIdentifier:(NSString *)string

    用本地标示符初始 本地化信息,例如zh_CN标示中国大陆

    NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];

    NSString *localeStr = [locale localeIdentifier];

    NSLog(@"locale:%@",localeStr);

    打印:locale: zh_CN

    另外可以使用+ (NSArray *)availableLocaleIdentifiers方法,返回所有的可用标识符。

    NSArray * availableLocaleIdentifiers = [NSLocale availableLocaleIdentifiers];

    NSLog(@"%@",availableLocaleIdentifiers);

    NSLoale常用对象方法与类方法:


    1,

    // 获取所有已知合法的国家代码数组列表

    [NSLocale ISOCountryCodes] ;

    // 获取所有已知合法的ISO货币代码数组列表

    [NSLocale ISOCurrencyCodes] ;

    // 获取所有已知合法的ISO语言代码数组列表

    [NSLocale ISOLanguageCodes] ;

    2,- (id)objectForKey:(id)key

    获取本地化对象的具体内容,例如下面的代码返回了当前货币符号:

    NSLocale *locale = [NSLocale currentLocale];

    //key值参见NSLocale Calendar Keys

    NSString *currencySymbol = [locale objectForKey:NSLocaleCurrencySymbol];

    NSLog(@"%@",currencySymbol);

    打印:¥

    上面的方法相当于 -(NSStrng *) currencySymbol;

    NSLocale *locale = [NSLocale currentLocale];

    NSString *currencySymbol = [locale currencySymbol];

    NSLog(@"%@",currencySymbol);

    打印结果也是:¥,推荐使用下面这种方式,简单方便,不用Key。

    3,获取当前语言的排版方向和字符方向

    [NSLocale lineDirectionForLanguage:[[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode];

    [NSLocale characterDirectionForLanguage:[[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode] ;

    4,- (NSString *)displayNameForKey:(id)key value:(id)value

    以本地化方式获取国际化信息的显示名称

    NSArray * availableLocaleIdentifiers = [NSLocale availableLocaleIdentifiers];

    NSLocale *locale = [[NSLocale alloc]

    initWithLocaleIdentifier:@"zh_CN"];

    for (NSString *identifiers in availableLocaleIdentifiers) {

    NSString *str = [locale displayNameForKey:NSLocaleIdentifier

    value:identifiers];

    NSLog(@"%@--%@",identifiers,str);

    }

    打印: 

    eu--巴斯克文

    hr_BA--克罗地亚文(波斯尼亚和黑塞哥维那)

    en_CM--英文(喀麦隆)

    en_BI--英文(布隆迪)

    rw_RW--卢旺达文(卢旺达)

    ast--阿斯图里亚思特文

    en_SZ--英文(斯威士兰)

    he_IL--希伯来文(以色列)

    ..... ...... ......  一部分

    5,监听用户本地化设置的消息

    [[NSNotificationCenter defaultCenter] addObserver:self

    selector:@selector(localChangedHandler:)

    name:NSCurrentLocaleDidChangeNotification object:nil];

    相关文章

      网友评论

        本文标题:IOS开发中的时间与日期(上)

        本文链接:https://www.haomeiwen.com/subject/rrpxottx.html