|
这周在做数据库迁移(v1.sqlite to v2.sqlite,需求:更改数据库里面某个字段的值,数据库用的是coredata,在读取数据库、迁移是用的是FMDB)时,遇到一个比较奇怪的bug(其实一点都不奇怪,只怪自己图样图生破)。就是时间字段(coredata存储的是NSDate对象)迁移后的年份是1985年(比如:原数据库的时间是2016.2.26,而迁移后却是1985.2.26),百事不得其解……后面查到原因是因为Apple NSDate对象存储的时候不是以1970.1.1作为基准,而是以2001.1.1作为基准的,详情请看下面。0 ~- k1 e2 O0 q W/ y1 F
- NSDate objects encapsulate a single point in time, independent of any particular calendrical system or time zone. Date objects are immutable, representing an invariant time interval relative to an absolute reference date (00:00:00 UTC on 1 January 2001).
复制代码当时我想用最暴力、最原始的方法,写个方法在某个NSDate对象上面直接加31年,因为时间赶嘛,但是想想觉得这个还是太恶心了,不厚道。后面查了NSDate Class Reference才得以根本解决。
1 ~$ y3 d0 b8 ?9 h" W - /// method 1
- ^5 D% Z/ n, Y0 o! V. w - [NSDate dateWithTimeIntervalSinceReferenceDate:date.timeIntervalSince1970];
9 R, A- E+ x( D+ |0 o/ ` - /// method 2
7 H9 U0 D& N. J) s! {! o9 o* U - [date dateByAddingTimeInterval:NSTimeIntervalSince1970];
复制代码date就是用FMDB取出来的数据. 虽然问题得到了解决,但还是遇到一个问题,当数据库存储的是1、2月份的时间时,按照上面的方法转换会比存储的多一天,但是其他月份就没有这个问题。
" i1 K( x- Y$ `5 W" [ - NSString *timeString1 = @"1985-02-28 09:12:23";& m, U" z, K# G' K/ O& b4 D
- NSTimeInterval timeStamp1 = 477882743;
# p9 A. ~# z |# f; A/ c - NSDate *stampDate1 = [NSDate dateWithTimeIntervalSince1970:timeStamp1];& H8 t& _4 T; m- k1 A# J' C- h
- ' M7 {% M8 { f. `
- NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
' k) a& L( P% F I+ G4 } - [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
7 I$ d% \- q. j3 F; H$ }0 I - NSDate *date11 = [dateFormatter dateFromString:timeString1];
" P* q& [; Z7 k1 S - NSDate *date12 = [NSDate dateWithTimeIntervalSinceReferenceDate:date11.timeIntervalSince1970];
* G4 r3 s2 I) J( U - NSDate *date13 = [date11 dateByAddingTimeInterval:NSTimeIntervalSince1970];
4 i: P+ U/ M3 F4 o7 ~9 D8 Z& u - NSLog(@"\ndate11:%@ \ndate12:%@ \ndate13:%@ \nstampDate1:%@ ",date11,date12,date13,stampDate1);
2 r1 D! v0 B+ T/ h* C: X - /*
" G. F3 A" _8 Y& } - date11:1985-02-28 01:12:23 +0000 - L2 V2 v. k, b4 K
- date12:2016-02-29 01:12:23 +0000 6 b* p% l. i" q; y! o
- date13:2016-02-29 01:12:23 +0000
$ _4 `+ F3 K. T" p- t; P" |; ^. N) p - stampDate1:1985-02-22 01:12:23 +0000 & `0 w) q" e% o+ e p3 f2 y- i
- */
0 Y" L0 z H, S( k1 l! q
; h, q# X/ |( n- ]! p# x7 ~- NSString *timeString2 = @"1985-03-28 09:12:23";$ c! d! d8 s6 K: k- B+ Q8 o1 Q
- NSTimeInterval timeStamp2 = 480647543;
! t+ ~( E# l9 ^' O; u4 x' Z2 V* r - NSDate *stampDate2 = [NSDate dateWithTimeIntervalSince1970:timeStamp2];0 j! J- f4 T1 E- g7 x: I
- NSDate *date21 = [dateFormatter dateFromString:timeString2];
$ i* U8 u3 k: l - NSDate *date22 = [NSDate dateWithTimeIntervalSinceReferenceDate:date21.timeIntervalSince1970];
, g) L6 r+ Y4 _; z) |3 D- e - NSDate *date23 = [date21 dateByAddingTimeInterval:NSTimeIntervalSince1970];
% Q9 a5 J7 j* v% C - NSLog(@"\ndate21:%@ \ndate22:%@ \ndate23:%@ \nstampDate2:%@ ",date21,date22,date23,stampDate2);
, C" d4 u( H* j - /*. q( R% @1 j. p3 n) E) N
- date21:1985-03-28 01:12:23 +0000 - O4 A$ ]' T! [! I
- date22:2016-03-28 01:12:23 +0000
4 s( Z$ f. ]( U7 Z7 ~3 p( l - date23:2016-03-28 01:12:23 +0000 + A; l1 C: i/ q. {% L
- stampDate2:1985-03-26 01:12:23 +0000
& @& d& J1 g; H) ? N; h - */
复制代码 参考链接
# S! T9 \4 r9 ~ I- k
- f9 u1 v8 ^ V; x+ N5 B |