在做項目期間,有時候莫名其妙發現服務器端返回的時間字符串正確,結果轉換成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獲取某個大區間有多少個小區間,如某月中有多少天