OC里的日期函数是NSDate和Java差不多。
常用函数
1 初始化
NSDate *da = [NSDate dateWithTimeIntervalSinceNow:0];
根据系统时间初始化得到一个NSDate。这里需要提一句。在IOS系统内部,对于NSDate的存储都是按照零时区的时间存储的。怎么说呢?假设现在的系统的时间是晚上八点,我们是处在东五区的,那么现在我们输出这个da实例的时间值应该是(20-8),即显示的时间是中午十二点。这是系统规定,但是看起来怪别扭的,所以可以后面0的位置加上8个小时,这样显示的就是现在我们这个时区的时间。这个参数的单位是秒,所以,代码就是这样的。
NSDate *da = [NSDate dateWithTimeIntervalSinceNow:8*60*60];
2 添加时间
da = [da dateByAddingTimeInterval:5 * 60];
参数的单位是以秒为单位的。
3 获得两个NSDate的时间差
NSTimeInterval nt = [da timeIntervalSinceNow];
NSLog(@"%f", nt / 60 / 60);
获得对象和当前系统时间的,返回的值也是以秒为单位的。
NSTimeInterval nt1 = [da timeIntervalSinceDate:da1];
NSLog(@"%f",nt1 / 60 / 60);
获得对象和da1之间的时间差,以秒为单位
4 判断两个NSDate是否相同
BOOL b1 = [da isEqualToDate:da1];
日期格式转换类NSDateFormatter
与Java极其的相似,OC系统原生的日期类展现的形式非常的难看。OC也提供了格式转换类。
1 初始化
NSDate *nd = [NSDate date];
NSDateFormatter *df1 = [[NSDateFormatter alloc] init];
2 设置格式
[df1 setDateFormat:@"yyyy年MM月dd日 HH时mm分ss秒"];
注意月份的占位符是MM,而分钟的占位符是mm,还有!!小时的占位符是HH。
3 日期和字符串之间的转换
NSString *str1 = [df1 stringFromDate:nd];
NSLog(@"%@", str1);
NSString *timer = @"2015年11月3日 12时24分6秒";
NSLog(@"%@", [df1 dateFromString:timer]);
这里得提一句,在OC中的日期类是比较脆弱的,不,是很脆弱的,但凡一点错误就会导致最后的结果是个空。例如:格式化字符串的占位符错了,字符串和格式化的字符串不匹配,年月日时分秒的数字大于实际可能值,如秒数写60。还有,OC中的NSDate是通过存储1970年至现在的秒数来确定时间的,所以如果时间的年份写在1970年以前,也是不会获得正确的时间值得。
最最重要的一点:是NSDateFormatter这个类,他在转换的时候会自动进行时间加减。就是说,一个NSDate类型的转成字符串的时候,因为存储的时候存的是零时区,在转换的时候会自动加上现在的东八时区的时差,得到的就是东八的时间。同理,再从字符串转换为NSDate的时候,依旧是减去东八的时差,在电脑存储的还是零时区的时间。
但是这就带来一个问题。如果我们想把一个字符串转换成Date获得时间并显示,发现时间总是和我们的时区差8个小时,就是因为在转换的时候被自动减掉了8个小时。这就需要我们加上8个小时。就想上面代码的第三四行,输出的时候就会看到了。