在做项目期间,有时候莫名其妙发现服务器端返回的时间字符串正确,结果转换成NSDate时却莫名其妙少了8个小时,查了很多资料,很多说只要设置一下formatter的NSLocal就可以,像下面这样
- 解决方法一 设置locale(经测试,没作用)
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyyMMdd HHmmss";
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_cn"]; // 固定中国的时区
// formatter.timeZone = [NSTimeZone systemTimeZone]; // 系统设置的时区
- 解决方案二 使用timeZone添加相差的时区 (经测试,能完美解决这个时间偏差的问题),
需要注意的是date用famatter转换成String字符串时不需要加偏移量,直接转换就正常
可以通过以下代码知道都有哪些时区
NSArray *arr = [NSTimeZone knownTimeZoneNames];
中国大陆所有的时区为
上海(上海时区就是中国的标准时间北京时间):"Asia/Shanghai"、
重庆:"Asia/Chongqing"、
乌鲁木齐:"Asia/Urumqi",
另外属于中国的还有
香港:"Asia/Hong_Kong"、
台北:"Asia/Taipei"
具体修正偏移8小时时区问题如下
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyyMMdd HH:mm:ss";
// 由字符串转换成时间
NSDate *date = [formatter dateFromString:@"20170501 01:12:13"];
// 获取系统的时区,
NSTimeZone * zone = [NSTimeZone systemTimeZone];
// 获取时间的时区与指定时区zone之间相差的秒数
NSInteger interval = [zone secondsFromGMTForDate:date];
// 将偏差的时间加到原来的时间上就是正式的时间
NSDate *systemZoneDate = [date dateByAddingTimeInterval:interval];
- 一下是整理的NSDateFormatter的常用格式
<pre>
yyyyyMMdd HH:mm:ss 20170520 13:14:59`
yyyy-MM-dd HH:mm:ss 2017-05-20 13:14:59
</pre>
代号 | 代表意义 | 例子 |
---|---|---|
G | 公元时代 | 例如AD公元 |
yy | 年的后2位 | 如2017年的17 |
yyyy | 完整年 | 2017 |
MM | 月 | 显示为01-12,两位的月份 |
MMM | 简写月英文 | 显示为英文月份简写,如 Jan |
MMMM | 全写月英文 | 显示为英文月份全称,如 Janualy |
dd | 日 | 2位数表示,如02 |
d | 日 | 1-2位显示,如 2 |
EEE | 简写星期几 | 如Sun |
EEEE | 全写星期几 | 如Sunday |
aa | 上下午 | AM/PM |
H | 时 | 24小时制,0-23 |
HH | 时 | 24小时制,00-23 |
K | 时 | 12小时制,0-11 |
m | 分 | 1-2位 |
mm | 分 | 2位 ,00~60 |
s | 秒 | 1-2位 |
ss | 秒 | 2位,不足两位的前面补0 |
S | 毫秒 | 1秒为1000毫秒 |
Z | 时区 | GMT |
- 处理时间的常用类还有NSCalendar
- 1.使用calender和components获取常见的年、月、日、星期等属性
<pre>
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [NSDate date];
NSDateComponents *components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth fromDate:date];
然后就可以从components中获取如下内容
@property NSInteger era;
@property NSInteger year;
@property NSInteger month;
@property NSInteger day;
@property NSInteger hour;
@property NSInteger minute;
@property NSInteger second;
@property NSInteger weekday;
</pre>
- 1.使用calender和components获取常见的年、月、日、星期等属性
- 使用calendar获取某个大区间有多少个小区间,如某月中有多少天
<pre>
NSCalendar *calendar = [NSCalendar calendarWithIdentifier:NSGregorianCalendar];
NSDate *date = [NSDate date];
NSRange range = [calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:date];
NSLog("本月有 %ld天",range.length);
</pre>
- 使用calendar获取某个大区间有多少个小区间,如某月中有多少天