使用SQLITE3和Objective C转换DATETIME的问题

时间:2013-01-13 16:28:10

标签: iphone datetime sqlite nsdate

我有一个带有DATETIME列的sqlite3数据库,其中包含如下格式的值:
2013-01-09 04:00:00

我想弄清楚如何确定时间是AM还是PM?

以下是使用Objective-C从Sqlite3数据库读取和转换DATETIME对象的方法:

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
char *DateTimeColumn = (char *)sqlite3_column_text(statement, 13);
NSDate *myDate =[dateFormat dateFromString:[NSString stringWithUTF8String:DateTimeColumn]];

这很有效,但不知道这是凌晨4点还是下午4点。

我看到一条帖子建议在格式化程序字符串末尾添加a,如下所示:
"yyyy-MM-dd hh:mm:ss a"
...弄清楚上午/下午 - 但这导致了崩溃。 (我当然也将AMPM添加到我的DATETIME列中的实际值中,如下所示:
2013-01-09 04:00:00 AM
但它仍然坠毁。

不确定我做错了什么 - 或者这是不是做不了。

唯一的解决方案是让DB本身的条目都在24小时内。格式(意思是:4:00 PM应该输入为16:00) - 然后使用IF语句从值中减去12> 12,以确定时间的AM或PM'? 我原本以为这会有一些自动化功能......有什么想法吗?

=================================

编辑/更新:
将字符串转换为NSDate后,我突然得到'(null)'。这是代码的当前版本:

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
char *DateTimeColumn = (char *)sqlite3_column_text(statement, 13);
NSString *DateTimeString = [NSString stringWithUTF8String:DateTimeColumn];
NSLog(@"DateTimeString = %@", DateTimeString);
   // This NSLog gives me a good string: "DateTimeString = 2013-01-09 16:00:00"
// But when I create an NSDate object from this string:
NSDate *myDate =[dateFormat dateFromString:DateTimeString];
// ... and log it out: 
NSLog(@"the REAL DATETIME object = %@", [myDate description]);
// the console shows: "the REAL DATETIME object = (null)"
// and when I add this NSDate object to my Array of NSDates, I crash:
[tempNSDateObjectsArray addObject:myDate];

Console shows: 
*** Terminating app due to uncaught exception 'NSInvalidArgumentException',     
reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
*** First throw call stack:

2 个答案:

答案 0 :(得分:1)

HH,而不是hh,适用于24小时日期格式:

[dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

使用hh作为小时格式解析“2013-01-09 16:00:00”失败,因此返回nil

请注意NSDateFormatter根据本地时区解释日期字符串,除非您设置了显式时区。您可能希望将时区信息添加到字符串中,或​​使用不同的格式(例如,自1992年1月1日起的UNIX时间,秒)来存储日期。


ADDED: SQLite datetime()函数返回字符串“YYYY-MM-DD HH:MM:SS”,这是UTC / GMT的日期和时间。要将此类字符串转换为NSDate,请使用NSDateFormatter并将时区设置为GMT:

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
[dateFormat setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

NSString *dateTimeString = @"2013-01-09 16:00:00";
NSLog(@"DateTimeString = %@", dateTimeString);

NSDate *myDate =[dateFormat dateFromString:dateTimeString];
NSLog(@"myDate:          %@", myDate);

输出:

dateTimeString = 2013-01-09 16:00:00
myDate:        = 2013-01-09 16:00:00 +0000

向用户提供日期,请使用NSDateNSString转换为stringFromDate,但不要设置时区(以便本地时区使用):

NSDateFormatter *dateFormat2 = [[NSDateFormatter alloc] init];
[dateFormat2 setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

NSString *localDateString = [dateFormat2 stringFromDate:myDate];
NSLog(@"localDateString: %@", localDateString);

输出:

localDateString: 2013-01-09 17:00:00

现在时间显示为17:00:00,因为我当地的时区是“GMT + 01”。

答案 1 :(得分:0)

24小时格式是格式在SQLite日期字段中有效。

请注意,数据库中的字符串不能直接显示给用户;为用户的时区和格式化首选项修改它们是应用程序的工作。