2

文字列を NSDate オブジェクトに変換しようとしています。次のコードを使用して変換を行っています。

NSDateFormatter * dateFormat = [[NSDateFormatter alloc] init];
NSTimeZone *tz = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
[dateFormat setDateFormat:@"M/d/yyyy HH:mm:ss a"];
[dateFormat setTimeZone:tz];

NSDate * dtEventStart = [dateFormat dateFromString:@"1/7/2013 6:30:00 AM"];
NSDate * dtEventEnd = [dateFormat dateFromString:@"1/7/2013 8:45:00 PM"];

NSLog(@"dtEventStart: %@", dtEventStart);
NSLog(@"dtEventEnd: %@", dtEventEnd);

ただし、出力は次のようになります。

dtEventStart: 2013-01-07 00:30:00 +0000
dtEventEnd: 2013-01-07 12:45:00 +0000

出力された時刻と日付は、変換に使用された文字列と同じではありません。timeZone にも EST を使用してみましたが、次のように異なる誤った結果が生成されます。

dtEventStart: 2013-01-07 05:30:00 +0000
dtEventEnd: 2013-01-07 17:45:00 +0000

私は何かが欠けていることを知っていますが、何がわかりません。どんな助けでも大歓迎です。

ありがとうございました

アップデート:

ここは

EKEventStore *eventStore = [[EKEventStore alloc] init];

EKEvent * eventForCalendar  = [EKEvent eventWithEventStore:eventStore];
eventForCalendar.title     = event.title;

NSDateFormatter * dateFormat = [[NSDateFormatter alloc] init];
NSTimeZone *tz = [NSTimeZone timeZoneWithAbbreviation:@"EST"];
[dateFormat setDateFormat:@"M/d/yyyy HH:mm:ss a"];
[dateFormat setTimeZone:tz];

NSDate * dtEventStart = [dateFormat dateFromString:@"1/7/2013 6:30:00 AM"];
NSDate * dtEventEnd = [dateFormat dateFromString:@"1/7/2013 8:45:00 PM"];

NSLog(@"dtEventStart: %@", dtEventStart);
NSLog(@"dtEventEnd: %@", dtEventEnd);

eventForCalendar.startDate = dtEventStart;
eventForCalendar.endDate = dtEventEnd;

[eventForCalendar setCalendar:[eventStore defaultCalendarForNewEvents]];
NSError *err;
[eventStore saveEvent:eventForCalendar span:EKSpanThisEvent error:&err];
4

2 に答える 2

0

次のコードを試してください:-

NSDateFormatter * dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"MM/dd/yyyy hh:mm:ss a"];
[dateFormat setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];

NSDate * dtEventStart = [dateFormat dateFromString:@"1/7/2013 6:30:00 AM"];
NSDate * dtEventEnd = [dateFormat dateFromString:@"1/7/2013 8:45:00 PM"];

NSLog(@"dtEventStart: %@", dtEventStart);
NSLog(@"dtEventEnd: %@", dtEventEnd);

24 時間形式で次の出力が得られます。

dtEventStart: 2013-01-07 06:30:00 +0000
dtEventEnd: 2013-01-07 20:45:00 +0000
于 2013-01-08T09:01:26.110 に答える
0

解析のために、ドキュメントでは、最初に日付フォーマッタのロケールを en_US_POSIX に設定することを推奨しています。

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html#//apple_ref/doc/uid/TP40002369-SW7

また、日付フォーマッタに関するこの Q&A:

http://developer.apple.com/library/ios/#qa/qa1480/_index.html

NSDateFormatter を使用してインターネット スタイルの日付を解析していますが、これは一部の地域の一部のユーザーでは失敗します。特定の日付形式文字列を設定しました。ユーザーの地域設定とは無関係に NSDateFormatter を強制的に動作させるべきではありませんか?

いいえ。日付形式文字列の設定はほとんどのユーザーにとって機能するように見えますが、この問題に対する適切な解決策ではありません。フォーマット文字列が予期しない動作をする場所がたくさんあります。例えば:

于 2013-01-07T23:57:33.647 に答える