Pertanyaan Bagaimana mem-parsing string tanggal ke dalam objek NSDate di iOS?


Saya mencoba mem-parsing string tanggal dari xml menjadi objek NSDate di aplikasi iPhone

Saya sadar ini pasti sudah ditanyakan sebelumnya, namun, saya yakin saya memiliki sintaks yang benar, tetapi itu tidak berhasil. Apakah ada masalah dengan kode saya?

String tanggal yang perlu saya parse adalah:

2011-01-21T12:26:47-05:00

Kode yang saya gunakan untuk menguraikannya adalah:

self.dateFormatter = [[NSDateFormatter alloc] init];
    [self.dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    [self.dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];
    [self.dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];



... 

else if([elementName isEqualToString:kUpdated]){
    self.currentQuestion.updated = [self.dateFormatter dateFromString:self.currentParsedCharacterData ];
}

Setiap bantuan sangat dihargai. Terima kasih!

** Berdasarkan referensi tautan dari theChrisKent, saya memperbaiki masalah seperti ini:

else if([elementName isEqualToString:kLastOnDeck]){

    NSString *dateStr = self.currentParsedCharacterData;
    // we need to strip out the single colon
    dateStr = [dateStr stringByReplacingOccurrencesOfString:@":" 
                                                 withString:@"" 
                                                    options:0 
                                                      range:NSMakeRange([dateStr length] - 5,5)];




    self.currentQuestion.lastOnDeck = [dateFormatter dateFromString:dateStr];

}

48
2018-02-15 02:31


asal


Jawaban:


Anda tidak perlu dekat dengan banyak tanda kutip tunggal seperti yang Anda miliki (hanya diperlukan pada karakter bukan tanggal / waktu), jadi ubah ini:

[self.dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];

Untuk ini:

[self.dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"];
...
self.currentQuestion.updated = [self.dateFormatter dateFromString:[self.currentParsedCharacterData stringByReplacingOccurrencesOfString:@":" withString:@"" options:0 range:NSMakeRange([self.currentParsedCharacterData length] – 5,5)]];

Dokumentasi di sini: https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html#//apple_ref/doc/uid/TP40002369-SW1

Pola Format Unicode: http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns

Berurusan dengan TimeZones dengan Colons (+00: 00): http://petersteinberger.com/2010/05/nsdateformatter-and-0000-parsing/


64
2018-02-15 02:41



Saya mengalami masalah yang sama dengan usus besar pada akhirnya. Inilah fungsi yang saya gunakan untuk menormalkan tanggal yang harus dibuat NSDate senang.

/**
 * Timezones are returned to us in the format +nn:nn
 * The date formatter currently does not support IS 8601 dates, so
 * we convert timezone from the format "+07:30" to "+0730" (removing the colon) which
 * can then be parsed properly.
 */
- (NSString *)applyTimezoneFixForDate:(NSString *)date {
    NSRange colonRange = [date rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@":"] options:NSBackwardsSearch];
    return [date stringByReplacingCharactersInRange:colonRange withString:@""];
}

3
2018-02-15 03:38



Butuh beberapa saat untuk menemukan jawaban sederhana untuk ini. dan ada banyak solusi yang melibatkan membawa kode ekstra pihak ketiga.

Bagi mereka yang sedang berjuang dengan ini sekarang dan hanya mendukung iOS 6 ke atas.

Anda dapat mengatur formatter tanggal ke

[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"]

Dan ini akan menangani "-05: 00" dengan usus besar.


3
2018-06-25 19:32



Solusinya adalah mengubah:

[self.dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];

Untuk notasi ini:

[self.dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];

saya berharap ini akan membantu Anda.


1
2017-12-30 11:36



ISO8601DateFormatter

Saya telah sukses besar dengan perpustakaan ini yang tersedia sebagai CocoaPod.

https://github.com/boredzo/iso-8601-date-formatter

Pemakaian

- (ISO8601DateFormatter *)dateFormatter
{
    static ISO8601DateFormatter *dateFormatter = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        dateFormatter = [[ISO8601DateFormatter alloc] init];
        dateFormatter.includeTime = YES;
    });

    return dateFormatter;
}


NSDate *date = [[self dateFormatter] dateFromString:@"2015-05-09T13:06:00"];

1
2018-05-09 11:03



Masalahnya adalah 'Z' di bagian akhir. Cara Anda menulisnya dalam tanda kutip, parser Anda mengharapkan karakter literal Z dalam string waktu Anda, dan tidak ada satu pun. Yang Anda inginkan adalah karakter pemformatan Z tanpa tanda kutip, yang menunjukkan bahwa string waktu Anda berisi informasi zona waktu. Yang dilakukan, -05: 00 di ujung string Anda adalah zona waktu.

Karena Anda mengharapkan informasi zona waktu, pengaturan zona waktu dalam formatter tanggal Anda agak tidak berguna. Dan periksa tautan ke pola pemformatan Unicode, tautan itu berisi informasi pasti yang harus Anda percayai di atas semua jawaban yang Anda dapatkan di sini.


1
2018-05-09 12:24



Pada iOS 10 sistem yang disediakan NSISO8601DateFormatter tersedia untuk format khusus ini.


0
2017-09-05 21:06