Iphone 使用SQLITE3和Objective C转换日期时间的问题
我有一个sqlite3数据库,它的DATETIME列包含如下格式的值: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
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