看官们,我们在上一章回中介绍了Foundation框架中的NSDate,本章回中将介绍Foundation框架中的NSDateFormatter。
NSDateFormatter是Foundation框架中的类,它用来转换日期和时间。主要的转换操作有以下两种:
- 1.把NSDate类型的日期和时间对象转换为NSString类型的对象,以方便程序使用;
- 2.把存放在NSString对象中的日期和时间转换为NSDate类型的对象;
该类提供了相关的方法来实现转换操作,接下来我们介绍如何使用这些方法。
初始化属性
该类的初始化和其它类的初始化方法完全一样,下面是一个示例代码:
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
不过初始化以后需要设置类中相关属性,不然无法进行日期转换操作。需要设置的属性如下:
locale
用来指定相关的区域,因为不同的区域使用不同格式日期和日间,比如有的地区日期格式为年月日,有的地区则是月日年。给该属性赋值时需要使用NSLocale类型的对象,具体操作如下:
[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
方法中参数的值是"en_US"它表示美国地区,我们国家使用"zh_GB",其它国家的代码可以通过以下方法来查询:
@property(class, readonly, copy) NSArray<NSString *> *availableLocaleIdentifiers;
该方法把当前系统支持的国家代码存储到数组中然后通过返回值返回,不过数组中的值是"en_US"这样的代码,我们只能猜测结合国家的英文名字猜测代码到底代表哪个国家,可读性差一些。顺便吐槽一下苹果官方开发文档,像这种国家代码什么的内容都没有直接给出来,还需要到文档中四处搜索,而且我只搜索到了部分国家的代码,没有找到一份完整国家的代码。
timeZone
用来指定时区,地区不同时区也不同,比如我们现在是晚上,美国则是白天。给该属性赋值时需要使用NSTimeZone类型的对象,具体操作如下:
[[NSTimeZone alloc] initWithName:@"Asia/Shanghai"];
该方法的参数中使用了时区名字,我们可以通过以下方法来查询时区名字:
@property(class, readonly, copy) NSArray<NSString *> *knownTimeZoneNames;
该方法把当前系统支持的时区存储到数组中然后通过返回值返回,数组中的值是"Asia/Shanghai"这样的代码,我们从城市名字上就能知道是哪个国家哪个地区的时区,这点还是很方便的。不过我的经验是使用UTC加上或者减去时差来当作参数,毕竟各个国家与UTC的时差很容易查找到。比如我们国家在东八区使用UTC+8就能表示我们国家的时区,纽约在西五区使用UTC-5就可能得到纽约的时区。
dateStyle
用来控制日期和格式
timeStyle
用来控制时间的格式
这两个属性只能使用NSDateFormatterStyle枚举常量进行赋值,枚举常量值一共五个,具体如下:
- NSDateFormatterNoStyle //没有日期或者时间
- NSDateFormatterShortStyle
- NSDateFormatterMediumStyle
- NSDateFormatterLongStyle
- NSDateFormatterFullStyle //完整的日期和时间
每个枚举常量值表示的日期和时间形式不同,有的日期中包含星期,有的没有,有的时间中包含am/pm信息,有的则没有。建议大家自己动手体会一下不同枚举常量值代表的不同日期和时间格式,如果不清楚使用哪个枚举常量合适,可以使用最后一个枚举常量,它会包含所有的日期和时间信息。
如果觉得枚举常量代表的形式不符合自己的需求,可以自己定义日期和时间格式,具体操作如下:
//dateFormat是已经定义好的NSDateFormatter对象
[dateFormat setLocalizedDateFormatFromTemplate:@"MMddyy, HH:mm:ss"];
代码中使用的格式是了个示例,完整的格式是"yyyyMMdd hh:mm:ss",yy表示年没有世纪20,四个y就表示世纪和年,例如2021.MM表示月份,HH表示小时,其中H大写是24小时格式,小写会显示am/pm。该格式中可以只使用部分内容,比如"MMdd"表示只有月和日,没有年和时间。
转换操作
把刚才介绍的四个属性设置好后就可以转换日期和时间了,具体的方法如下:
- (NSString *)stringFromDate:(NSDate *)date;
该方法把参数date中的日期和时间转换为NSString类型的日期和时间;
- (NSDate *)dateFromString:(NSString *)string;
该方法把参数string中的日期和时间转换为NSDate类型的对象.使用时有以下注意事项需要做说明:
- 1.该方法会把当前的日期和时间自动转换为UTC时间,因此设置没必要设置timeZone属性;
- 2.设置dateStyle和timeStyle属性时最好使用自定义的日期和时间格式,而不要使用枚举常量代表的格式;
- 3.设置dateStyle和timeStyle属性时日期和时间的格式需要和参数中日期和时间的格式完全一致才可以,否则无法转换,返回nil;
最后我们对本章回的内容做一个总结:
- 1.NSDateFormatter类主要用来在NSDate和NSString这两种不同类型的日期和时间对象之间做转换;
- 2.创建NSDateFormatter类的对象需要设置locale、timeZone、dateStyle和timeStyle这四个属性的值;
- 3.通过设置四个属性可以把UTC时间转换成符合特定地区和时区的日期和时间,同时还可以指定日期和时间的显示格式;
- 4.把存放在NSString对象中的日期和时间转换为NSDate类型的对象时,日期和时间的格式要求比较严格,否则无法完成转换;
看官们,本章回的内容就介绍到这里,欲知后事如何且听下回分解!