Nil NSDate取得しようとしたとき、日世界標準時間の文字列zulu時間
-
13-09-2019 - |
質問
書iPhoneアプリを、日付文字列形式(世界標準時間で書式、Zの終了を示すゼロUTCオフセット、ズールー)は、必要な構文解析へ NSDate
オブジェクトです。
少しのコード:
NSDateFormatter* df = [[NSDateFormatter alloc]init];
[df setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZ"];
NSString* str = @"2009-08-11T06:00:00.000Z";
NSDate* date = [df dateFromString:str];
このデバッガ date
終了まで nil
!私の想定では、あなたは私の日付フォーマット文字列になります。どうすればよいですかを正しく解析の日付文字列?
思うに
Z
の日付フォーマット文字通り、ラ設定の日付フォーマットへ yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
.する場合を除き、Zとして構文解析した文字の日付を失うオフセットの情報については曖昧であるとしていると解されるもの。
例えば、文字列を解析した2009-08-11T06:00:00.000Z(6:00zulu時間)までとして解釈される6:00現地時間、間違ったオフセットが適用されます。このとして構文解析2009-08-11T06:00:00.000-600 (12:00 zulu時間のオフセットによって、ユーザーのオフセットされます。
よろしく!
解決
私はそれがAppleのコード、または理解の私の不足の中APIのバグだ場合、私はわからないんだけど、私は私の日付文字列に時間オフセットを使用して、その周りに働いてきた、この問題もありました。
あなたはあなたの例では、コードを変更する場合:
NSDateFormatter* df = [[NSDateFormatter alloc]init];
[df setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZ"];
NSString* str = @"2009-08-11T06:00:00.000-0700"; // NOTE -0700 is the only change
NSDate* date = [df dateFromString:str];
これは、今、日付文字列を解析します。もちろん-0700時間私オフセットされて、あなたはあなたにそれを変更する必要があると思います。この情報がお役に立てば幸いです。
他のヒント
最も回答います"-"Z"としてリテラル文字です。 ない。
のZ実際にこの日はオフセットする0をUTC(+0000).
このタイムゾーン形式 Iso8601形式:
ISO8601時間帯フォーマット:常に、特定のUTCからのオフセットは、常に同一フォーマットを除く世界標準時間体(Z).
"-08:00"
"Z"
したいことでは下記のフォーマットでのごNSDateFormatter:
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// 2013-11-18T23:00:00.324Z
[formatter setTimeZone:[NSTimeZone localTimeZone]];
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"];
return formatter;
繰り返しの Z 五倍にしないといけないと考えているフォーマッタを使用iso8601形式の構文解析時には、文字列になります。
ボーナス:
- 利用に Zs RFC822GMT形式です。
- 利用につ Zs 局所的なGMT形式です。
詳しい情報を確認 この 書きします。
私は、Zが、実際にフォーマッタに何かを意味し、あなたはそれではなく、リテラル文字を表現したいので、あなたが、フォーマット文字列でZの周りに単一引用符を配置する必要があると思います。
[df setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];
の文字列を操作する必要はありません。 (あなたはそれでいる間やロケール)だけでNSDateFormatter
上のタイムゾーンを設定します:
NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[formatter setLocale:[NSLocale systemLocale]];
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];
、必要に応じて日付文字列を解析します:
NSDate * value = [formatter dateFromString:@"2012-03-01T23:08:25.000Z"];
NSLog(@"%@", value); // prints 2012-03-01 23:08:25 +0000
あなたはUTCから日付を取得するには、このメソッドを使用することができます。
+ (NSDate*)getDateFromUTCDateTimeString:(NSString*)dateString {
NSDateFormatter *isoDateFormatter = [[NSDateFormatter alloc] init];
[isoDateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];
[isoDateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
NSDateFormatter *userFormatter = [[NSDateFormatter alloc] init];
[userFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
NSDate *date = [isoDateFormatter dateFromString:dateString];
return [dateFormatter dateFromString:[userFormatter stringFromDate:date]];
}
これは、「Z」は、タイムゾーンコードのリテラルです..あなたを助けるかもしれません。 「O」(手紙、ゼロではない)を使用してみてください。リテラルは、「o」はUTCオフセットを意味します。私は、これはあなたを助け願って、しばらく前にこれに走っています。
-(NSDate*)dateFromZulu:(NSString*)str {
if (str == nil) {
NSLog(@"Error getting date");
return [NSDate date];
}
NSDateFormatter *f = [[NSDateFormatter alloc] init];
[f setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss Z"];
NSDate *ret = [f dateFromString:[str stringByReplacingOccurrencesOfString:@"Z" withString:@" +0000"]];
[f release];
if (ret == nil) {
ret = [NSDate date];
NSLog(@"Error formatting date (%@)",str);
}
return ret;
}