0

次のようにフォーマットされた値を含む DATETIME 列を持つ sqlite3 データベースがあります:
2013-01-09 04:00:00

時刻が AM か PM かを判断する方法を見つけようとしています。

以下は、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 かを判断できないことを除けば、非常にうまく機能します。次のようにフォーマッタ文字列の最後に を

追加することを提案する投稿を見ました: ... 午前/午後を把握する - しかし、それはクラッシュを引き起こしました。(もちろん、DATETIME列の実際の値にも次のように追加しました が、それでもクラッシュしました。 何か間違ったことをしている のか、それとも単に実行できないのかわかりませ ん。DB 自体のエントリはすべて 24 時間形式 (つまり、4:00PM は 16:00 として入力する必要があります) であり、ステートメントを使用して値 > 12 から 12 を減算し、時間の午前または午後を判断しますか? これには自動化された機能があると思っていたでしょう...何かアイデアはありますか?a
"yyyy-MM-dd hh:mm:ss a"
AMPM
2013-01-09 04:00:00 AM




IF

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

編集/更新:
文字列を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ではなくhh、24 時間形式の日付です。

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

hhas hour-formatを使用した "2013-01-09 16:00:00" の解析は失敗するため、 が返されますnil

NSDateFormatter明示的なタイム ゾーンを設定しない限り、 はローカル タイム ゾーンに従って日付文字列を解釈することに注意してください。文字列にタイム ゾーン情報を追加したり、別の形式 (UNIX 時間、1970 年 1 月 1 日からの秒数など) を使用して日付を格納したりすることができます。


追加: SQLitedatetime()関数は文字列 "YYYY-MM-DD HH:MM:SS" を返します。これは UTC/GMT の日付と時刻です。このような文字列を に変換するには、 aNSDateを使用し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しますが、タイム ゾーンは設定しません (ローカル タイム ゾーンが使用されるようにします)。NSStringstringFromDate

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 に答える