IOS开发中的时间与日期(上)
主要有以下几个类:
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];