我有一个带有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"
...弄清楚上午/下午 - 但这导致了崩溃。 (我当然也将AM
和PM
添加到我的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:
答案 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
要向用户提供日期,请使用NSDate
将NSString
转换为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日期字段中有效。
请注意,数据库中的字符串不能直接显示给用户;为用户的时区和格式化首选项修改它们是应用程序的工作。