NSDate
封装一个时间对象,不关乎格式、时区、本地信息等。也就是说,一个NSDate对象,它只是一个时间,不包含时区、地区等信息。
NSTimeZone
时区,抽象类,代表一个区域的时间。给一些对象提供属性,比如:NSDateFormate、NSCalendar、UIDatePicker等
系统时区
+ systemTimeZone
系统时区,如果不能获取系统时区,将会返回GMT时区。调用该方法获时区后,会进行缓存,如果系统时间发生改变,再次调用该方法,不会获取到最新的系统时区,而是得到之前的时区。可以调用+ resetSystemTimeZone
清除缓存。
默认时区
+ setDefaultTimeZone:
设置默认时区。
通过 + defaultTimeZone
和+ localTimeZone
都可以获取默认时区,如果没有设置默认时区,会得到系统时区。
两者区别:
NSTimeZone *defaultTimeZone = [NSTimeZone defaultTimeZone];
NSTimeZone * localTimeZone = [NSTimeZone localTimeZone];
defaultTimeZone
和localTimeZone
都表示默认时区。此时如果我们更改默认时区,即调用+ setDefaultTimeZone:
方法,defaultTimeZone
不会发生变化,而localTimeZone
也跟着发生变化。
常见用法
//获取系统可以识别的时区名字
NSArray *zoneNames = [NSTimeZone knownTimeZoneNames];
//通过时区名字创建时区
NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"Asia/Shanghai"];
//通过GTM时差创建时区
NSTimeZone *timeZone1 = [NSTimeZone timeZoneForSecondsFromGMT:60*60*8];
NSLocale
将语言、文化、公约和标准封装起来的抽象类,比如封装十进制符号,货币符号、日期显示格式等。
代码:
//系统可识别的地区identifier
NSArray *locales = [NSLocale availableLocaleIdentifiers];
for (NSString *identifier in locales) {
NSLocale *locale = [NSLocale localeWithLocaleIdentifier:identifier];
//根据NSLocale:locale 和 key:NSLocaleIdentifier 格式化value:identifier 得到格式化后的NSString
NSLog(@"%@",[locale displayNameForKey:NSLocaleIdentifier value:identifier]);
}
//根据identifier创建,zh表示中文,Hans表示简体,CN表示中国
NSLocale *newLocale = [NSLocale localeWithLocaleIdentifier:@"zh_Hans_CN"];
//获取系统语言偏好设置
NSArray *languages = [NSLocale preferredLanguages];
NSDateFormatter
系统自带的格式:
//系统自带格式化字符串
typedef NS_ENUM(NSUInteger, NSDateFormatterStyle) {
NSDateFormatterNoStyle = kCFDateFormatterNoStyle,//无输出
NSDateFormatterShortStyle = kCFDateFormatterShortStyle,//16/4/26 上午10:49
NSDateFormatterMediumStyle = kCFDateFormatterMediumStyle,//2016年4月26日 上午10:49:08
NSDateFormatterLongStyle = kCFDateFormatterLongStyle, //2016年4月26日 GMT+8 上午10:48:39
NSDateFormatterFullStyle = kCFDateFormatterFullStyle //2016年4月26日 星期二 中国标准时间 上午10:51:11
};
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
formatter.dateStyle = kCFDateFormatterFullStyle;
formatter.timeStyle = kCFDateFormatterFullStyle;
NSDate *now = [NSDate new];
NSString* outputString = [formatter stringFromDate:now];
自定义格式:
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
formatter.dateFormat = @"yyyy-MM-dd a HH:mm:ss EEEE"; //2016-04-26 上午 10:56:25 星期二
NSDate *now = [NSDate new];
NSString* outputString = [formatter stringFromDate:now];
NSLog(@"%@ --- %@",outputString,formatter.timeZone);
日期字段格式表
下表引用自ICU User Guide;详细信息可以参考unicode