10
10
#import " PFDateFormatter.h"
11
11
12
12
#import < sqlite3.h>
13
+ #import < sys/time.h>
13
14
14
15
@interface PFDateFormatter () {
15
16
dispatch_queue_t _synchronizationQueue;
16
17
17
18
sqlite3 *_sqliteDatabase;
18
19
sqlite3_stmt *_stringToDateStatement;
20
+ sqlite3_stmt *_dateToStringStatement;
19
21
}
20
22
21
- @property (nonatomic , strong , readonly ) NSDateFormatter *preciseDateFormatter;
22
-
23
23
@end
24
24
25
25
@implementation PFDateFormatter
26
26
27
- @synthesize preciseDateFormatter = _preciseDateFormatter;
28
-
29
27
// /--------------------------------------
30
28
#pragma mark - Init
31
29
// /--------------------------------------
@@ -52,37 +50,37 @@ - (instancetype)init {
52
50
-1 ,
53
51
&_stringToDateStatement,
54
52
NULL );
53
+ sqlite3_prepare_v2 (_sqliteDatabase,
54
+ " SELECT strftime('%Y-%m-%d T%H:%M:%f Z', ?, 'unixepoch');" ,
55
+ -1 ,
56
+ &_dateToStringStatement,
57
+ NULL );
55
58
56
59
return self;
57
60
}
58
61
59
62
- (void )dealloc {
60
63
sqlite3_finalize (_stringToDateStatement);
64
+ sqlite3_finalize (_dateToStringStatement);
61
65
sqlite3_close (_sqliteDatabase);
62
66
}
63
67
64
- // /--------------------------------------
65
- #pragma mark - Date Formatters
66
- // /--------------------------------------
67
-
68
- - (NSDateFormatter *)preciseDateFormatter {
69
- if (!_preciseDateFormatter) {
70
- _preciseDateFormatter = [[NSDateFormatter alloc ] init ];
71
- _preciseDateFormatter.locale = [NSLocale localeWithLocaleIdentifier: @" en_US_POSIX" ];
72
- _preciseDateFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT: 0 ];
73
- _preciseDateFormatter.dateFormat = @" yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" ;
74
- }
75
- return _preciseDateFormatter;
76
- }
77
-
78
68
// /--------------------------------------
79
69
#pragma mark - String from Date
80
70
// /--------------------------------------
81
71
82
72
- (NSString *)preciseStringFromDate : (NSDate *)date {
83
73
__block NSString *string = nil ;
74
+ NSTimeInterval interval = [date timeIntervalSince1970 ];
84
75
dispatch_sync (_synchronizationQueue, ^{
85
- string = [self .preciseDateFormatter stringFromDate: date];
76
+ sqlite3_bind_double (_dateToStringStatement, 1 , interval);
77
+
78
+ if (sqlite3_step (_dateToStringStatement) == SQLITE_ROW) {
79
+ const char *sqliteString = (const char *)sqlite3_column_text (_dateToStringStatement, 0 );
80
+ string = [NSString stringWithUTF8String: sqliteString];
81
+ }
82
+
83
+ sqlite3_reset (_dateToStringStatement);
86
84
});
87
85
return string;
88
86
}
0 commit comments