Iphone 使用SQLITE3和Objective C转换日期时间的问题

Iphone 使用SQLITE3和Objective C转换日期时间的问题,iphone,datetime,sqlite,nsdate,Iphone,Datetime,Sqlite,Nsdate,我有一个sqlite3数据库,它的DATETIME列包含如下格式的值: 2013-01-09 04:00:00 我想知道如何确定时间是上午还是下午 下面是我如何使用Objective-C从Sqlite3数据库读取和转换DATETIME对象: NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat:@"yyyy-MM-dd hh:mm:ss"]; char *DateTimeC

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


我想知道如何确定时间是上午还是下午

下面是我如何使用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”

... 计算上午/下午-但这导致了撞车。(我当然也在DATETIME列的实际值中添加了
AM
PM
,如下所示:
2013-01-09 04:00:00 AM

但它仍然崩溃了。

不确定我是否做错了什么事,或者这件事就是做不到。

唯一的解决方案是让数据库中的条目都采用24小时格式(意思是:下午4:00应输入为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:
24小时格式是SQLite日期字段中唯一有效的格式


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

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

[dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
hh
解析“2013-01-09 16:00:00”,因为小时格式失败,因此返回
nil

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


添加: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);
输出:

要向用户显示日期,请使用
stringFromDate
NSDate
转换为
NSString
,但不要设置时区(以便使用本地时区):

输出:


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

什么崩溃了?这应该不会崩溃,最多返回
nil
。你的代码中可能还有其他错误。是的,我刚刚注销了一些东西-出于某种原因,我突然得到了一个空对象。在创建我的NSDate对象后,我将其添加到数组中,我得到以下信息:
***由于uncaugh而终止应用程序ht异常“NSInvalidArgumentException”,原因:“***-[\uu NSArrayM insertObject:atIndex:]:object cannot be nil”
我将在顶部编辑该问题以了解更多详细信息……你是对的-修复了我的崩溃:-),但现在我的时间变得奇怪了-似乎增加了6小时。给我所有的时间。很明显,我们在处理时区问题。那么你如何解决这个问题呢?:-)@sirab333:还要注意,
NSDate
的NSLog()总是以格林尼治标准时间显示日期,而不是在您的时区。好的,很高兴知道。等等,你是说如果我把同一个NSDate对象记录下来,同时在标签上显示出来,我会得到不同的输出?@sirab333。否。
NSDate
是一个没有任何时区信息的时间点。打印
[myDate description]
仅对调试有用,因为它总是以GMT显示日期。要向用户显示日期,必须使用
-[NSDateFormatter stringFromDate:
')将日期转换为字符串。明白。有没有关于如何获取NSDate并将其格式转换为不同时区的示例?
dateTimeString = 2013-01-09 16:00:00
myDate:        = 2013-01-09 16:00:00 +0000
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