web-dev-qa-db-ja.com

ISO 8601タイムスタンプをNSDateに変換する:UTCタイムオフセットはどのように処理されますか?

ISO 8601タイムスタンプをNSDateに変換できません。 NSDateFormatterを使用しようとしましたが、タイムスタンプの最後に表示される[〜#〜] utc [〜#〜]タイムオフセットで動作しません。 。説明のために、次のようなタイムスタンプをNSDateに変換したいと思います:2011-03-03T06:00:00-06:00。私の質問は、「-06:00」の部分をどのように処理するのですか?日付フォーマット文字列としてyyyy-MM-dd'T'HH:mm:ssZを使用しようとしましたが、機能しません。助言がありますか?

37
EJV

:を削除する必要はありません。 「00:00」スタイルのタイムゾーンを処理するには、「ZZZZ」が必要です。

スウィフト

let dateString = "2014-07-06T07:59:00Z"

let dateFormatter = NSDateFormatter()
dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZ"
dateFormatter.dateFromString(dateString)

Objective-C

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
dateFormat.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
NSString *input = @"2013-05-08T19:03:53+00:00";
[dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZ"]; //iso 8601 format
NSDate *output = [dateFormat dateFromString:input];
NSLog(@"Date output: %@", output);
61
joel.d

私の場合、私はそのようなものを受け取りました:

「2015-05-07T16:16:47.054403Z」

そして私は使用しなければなりませんでした:

「yyyy '-' MM '-' dd'T'HH ':' mm ':' ss.SSSZ」

18
diegomen

問題は、タイムゾーンオフセット内の:文字です。そのコロンだけを明示的に削除することも、すべてのコロンを削除してから続行することもできます。例えば:

NSString *s = @"2011-03-03T06:00:00-06:00";
s = [s stringByReplacingOccurrencesOfString:@":" withString:@""];
NSDateFormatter *f = [[NSDateFormatter alloc] init];
[f setDateFormat:@"yyyy-MM-dd'T'HHmmssZZ"];
NSDate *d = [f dateFromString:s];
NSLog(@"%@", d);

このログ:

EmptyFoundation[5088:707] 2011-03-03 12:00:00 +0000
5
Dave DeLong

これが私が使う方法です:

-(NSDate *)dateFromISO8601String:(NSString *)dateString{
    if (!dateString) return nil;
    if ([dateString hasSuffix:@"Z"]) {
      dateString = [[dateString substringToIndex:(dateString.length-1)] stringByAppendingString:@"-0000"];
    }
    dateString = [dateString stringByReplacingOccurrencesOfString:@":" withString:@""];
    NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
    dateFormatter.dateFormat = @"yyyy-MM-dd'T'HHmmssZ";
    return [dateFormatter dateFromString:dateString];
}
4
stebooks

SwiftでISO 8601タイムスタンプをNSDateに変換する:

let dateFormatter = NSDateFormatter()
let inputDate = "2015-06-18T19:00:53-07:00"
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZ" //iso 8601

let outputDate = dateFormatter.dateFromString(inputDate)
println(outputDate!) //optional implicitly

または明示的にオプション:

if let outputDate = dateFormatter.dateFromString(inputDate) {
     println(outputDate) //no need !
}
3
CodeOverRide

Appleは ISO 8601形式の個別の形式 をサポートしています

目的C

NSISO8601DateFormatter *formater = [[NSISO8601DateFormatter alloc]init];
NSString *string = [formater stringFromDate:[NSDate date]];
0