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

96
献国
2017.03.24 10:37* 字数 2164

主要有以下几个类:

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

日记本