0

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

我试图弄清楚如何确定时间是上午还是下午?

以下是我使用 Objective-C 从我的 Sqlite3 DB 读取和转换 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:00 还是下午 4:00。

我看到一篇帖子建议a在格式化程序字符串的末尾添加一个,如下所示:
"yyyy-MM-dd hh:mm:ss a"
... 找出 AM/PM - 但这会导致崩溃。(我当然也像这样在我的 DATETIME 列中添加了AMPM实际值:
2013-01-09 04:00:00 AM
但它仍然崩溃。

不确定我是否做错了什么 - 或者这是否无法完成。

是唯一的解决方案数据库本身的条目都采用 24 小时格式(意思是:下午 4:00 应输入为 16:00) - 然后使用IF语句从 > 12 的值中减去 12 以确定时间的上午或下午?
我原以为会有一些自动化功能……有什么想法吗?

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

编辑/更新:
将字符串转换为 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:
4

2 回答 2

1

HH, not hh, 用于 24 小时日期格式:

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

使用 as hour-format 解析“2013-01-09 16:00:00”hh失败,因此返回nil.

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


添加: SQLitedatetime()函数返回一个字符串“YYYY-MM-DD HH:MM:SS”,它是 UTC/GMT 中的日期和时间。要将这样的字符串转换为 a NSDate,请使用 aNSDateFormatter并将时区设置为 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”。

于 2013-01-13T16:55:48.267 回答
0

24 小时格式是SQLite 日期字段中唯一有效的格式。

请注意,数据库中的字符串并不打算直接显示给用户;为用户的时区和格式偏好修改它们是应用程序的工作。

于 2013-01-13T16:52:40.093 回答