1010#import " PFDateFormatter.h"
1111
1212#import < sqlite3.h>
13+ #import < sys/time.h>
1314
1415@interface PFDateFormatter () {
1516 dispatch_queue_t _synchronizationQueue;
1617
1718 sqlite3 *_sqliteDatabase;
1819 sqlite3_stmt *_stringToDateStatement;
20+ sqlite3_stmt *_dateToStringStatement;
1921}
2022
21- @property (nonatomic , strong , readonly ) NSDateFormatter *preciseDateFormatter;
22-
2323@end
2424
2525@implementation PFDateFormatter
2626
27- @synthesize preciseDateFormatter = _preciseDateFormatter;
28-
2927// /--------------------------------------
3028#pragma mark - Init
3129// /--------------------------------------
@@ -52,37 +50,37 @@ - (instancetype)init {
5250 -1 ,
5351 &_stringToDateStatement,
5452 NULL );
53+ sqlite3_prepare_v2 (_sqliteDatabase,
54+ " SELECT strftime('%Y-%m-%d T%H:%M:%f Z', ?, 'unixepoch');" ,
55+ -1 ,
56+ &_dateToStringStatement,
57+ NULL );
5558
5659 return self;
5760}
5861
5962- (void )dealloc {
6063 sqlite3_finalize (_stringToDateStatement);
64+ sqlite3_finalize (_dateToStringStatement);
6165 sqlite3_close (_sqliteDatabase);
6266}
6367
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-
7868// /--------------------------------------
7969#pragma mark - String from Date
8070// /--------------------------------------
8171
8272- (NSString *)preciseStringFromDate : (NSDate *)date {
8373 __block NSString *string = nil ;
74+ NSTimeInterval interval = [date timeIntervalSince1970 ];
8475 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);
8684 });
8785 return string;
8886}
0 commit comments