后端 iOS 日期处理

thzm · October 15, 2019 · 96 hits

前几天在开发的时候遇到了日期方面的处理,花费了不少时间,踩了点坑,今天就把遇到的写一下.

本文内容

  1. 时间格式
  2. 时间差(两个日期之间的天数、月数、年数差)计算

时间格式

在 iOS 中 NSDateFormatter 处理时间格式的东东,上次有个需求,就是获取网络请求中 cookie 的时间

cookie 中的时间是这个酱子的:

1
Date:Sat, 21 May 2016 07:57:20 GMT

NSDateFormatter 中有一下格式:

格式 说明
G 公元时代,例如 AD 公元
yy 年的后 2 位 如:2016 中的 16
yyyy 完整年 如:2016
MM 月,显示为 1-12
MMM 月,显示为英文月份简写,如 Jan
MMMM 月,显示为英文月份全称,如 Janualy
dd 日,2 位数表示,如 02
d 日,1-2 位显示,如 2
EEE 简写星期几,如 Sun
EEEE 全写星期几,如 Sunday
aa 上下午,AM/PM
H 时,24 小时制,0-23
K 时,12 小时制,0-11
m 分,1-2 位 ( 0-9 是一位 )
mm 分,2 位
s 秒,1-2 位
ss 秒,2 位
S 毫秒
Z GMT

了解了上面的格式,那就容易多了,故格式是:EEE, dd MMM yyyy HH:mm:ss Z

1
2
3
4
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss Z"];

NSDate *date = [formatter dateFromString:@"Sat, 21 May 2016 07:57:20 GMT"];

但是上面的代码 得出的 date 可能是 nil,后面查了下原来是少设置了NSLocale (区域设置)

因为时间格式是英文的,所以:

1
2
3
4
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss Z"];
[formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
NSDate *date = [formatter dateFromString:@"Sat, 21 May 2016 07:57:20 GMT"];

另外,关于是使用 en_US_POSIX 还是 en_US 可以看这篇文章

当然,你设置成了 zh_CN ,那格式出来的是中文了,如 “EEE, dd MMM yyyy HH:mm:ss Z” 格式出来的:

1
周六, 21 52016 16:37:57 +0800

时间差计算

要计算两个日期的有多少天,多少个月,如果要自己计算的话,那就爽歪歪了,不过所幸 iOS 的日历功能 ( NSCalendar ) 可以给我们提供一些便利。

1
2
3
4
5
NSDate *date1 = [formatter dateFromString:@"2016-05-21"];
NSDate *date2 = [formatter dateFromString:@"2013-11-25"];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *components = [gregorian components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:date2 toDate:date1 options:0];
NSLog(@"year = %ld month = %ld day = %ld",components.year,components.month,components.day);

参考:

http://blog.csdn.net/crayondeng/article/details/8755306

http://www.125135.com/339261.htm

http://www.cnblogs.com/kaysun/p/5466508.html

No Reply at the moment.
You need to Sign in before reply, if you don't have an account, please Sign up first.