Memformat Tanggal dari waktu server ke waktu lokal menggunakan NSTimeZone dan Dateformatter

Saya menerima tanggal/waktu sebagai NSString dari server saya tempat saya mengubah waktu itu menjadi NSDate ke waktu lokal pengguna menggunakan NSTimeZone. Setelah itu saya mencoba memformat ulang NSDate ini menjadi NSString yang lebih mudah dibaca menggunakan format NSDateFormatter baru, namun ketika saya mencoba menerapkan format baru ini, dateString yang dihasilkan akan dikembalikan ke waktu Server asli.

Saya ingin tahu apa yang saya lakukan salah, saya ingin menunjukkan waktu yang dikonversi dalam format baru.

ini adalah kode yang saya gunakan

// set date format
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";

    // change time to systemTimeZone
    NSTimeZone *timeZone = [NSTimeZone systemTimeZone];
    [dateFormatter setTimeZone:timeZone];
    NSDate *localTime = [dateFormatter dateFromString:[singleInstanceActivationHistoryDictionay objectForKey:@"ActivationTime"]];


    // reformat converted Time to readable format
    NSDateFormatter *dateFormat1 = [[NSDateFormatter alloc] init];
    [dateFormat1 setDateFormat:@"dd/MM/yy - hh:mm a"];
     NSString *dateWithNewFormat = [dateFormat1 stringFromDate:localTime];


    NSLog(@"TimeZone - %@", timeZone);
    NSLog(@"UTC ServerTime - %@", [singleInstanceActivationHistoryDictionay objectForKey:@"ActivationTime"]);

    NSLog(@"UTC to deviceTimeZone - %@", localTime);
    NSLog(@"NewFormat - %@", dateWithNewFormat);

Ini adalah contoh keluaran saya

TimeZone - Pacific/Auckland (NZST) offset 43200
UTC ServerTime - 2013-08-22 01:45:59
UTC to deviceTimeZone - 2013-08-21 13:45:59 +0000
NewFormat - 22/08/13 - 01:45 AM

bantuan apa pun akan sangat dihargai


person HurkNburkS    schedule 22.08.2013    source sumber
comment
Zona waktu berapa tanggal yang diberikan server Anda? Anda perlu menyetel zona waktu NSDateFormatter pertama Anda ke zona waktu server sehingga NSDateFormatter akan menafsirkan string dalam zona waktu server. Dengan begitu, ketika Anda mendapatkan hasil NSDate, itu akan mewakili titik waktu yang benar (perhatikan bahwa NSDate objek tidak menyadari zona waktu, mereka mewakili momen waktu tertentu terlepas dari zona waktu dan musim panas, dll). Ketika Anda telah mengurai momen tertentu dengan benar, Anda dapat merepresentasikan momen spesifik tersebut dalam waktu setempat dengan menggunakan pemformat tanggal kedua   -  person dreamlax    schedule 22.08.2013
comment
oke.. jadi zona waktu server saya diatur adalah UTC   -  person HurkNburkS    schedule 22.08.2013
comment
itu berhasil. Saya mengatur dateFormatter ke UTC kemudian dateFormatter1 diatur ke timeZone.. bekerja dengan sempurna :) Saya hanya perlu mengubah nama var untuk mewakili data saya dengan lebih baik. :) Terima kasih untuk bantuannya   -  person HurkNburkS    schedule 22.08.2013
comment
Objek NSDate berisi (atau harus berisi, jika dibuat dengan benar) nilai GMT/UTC tanggal/waktu. Mendapatkan waktu di zona waktu lokal Anda adalah tugas pemformat tanggal. Anda tidak mengubah objek NSDate untuk mengatur zona waktu.   -  person Hot Licks    schedule 22.08.2013


Jawaban (1)


NSDateFormatter yang membaca tanggal harus disetel ke zona waktu tanggal yang Anda parsing, dalam kasus Anda, itu adalah UTC. Pemformat tanggal kemudian akan dapat menghasilkan objek NSDate (yang mewakili momen waktu tertentu tanpa memandang zona waktu). Anda kemudian dapat memberikan objek NSDate tersebut ke NSDateFormatter lain yang dikonfigurasi untuk memformat tanggal dalam zona waktu tertentu.

// set date format
NSDateFormatter *dateParser = [[NSDateFormatter alloc] init];
dateParser.dateFormat = @"yyyy-MM-dd HH:mm:ss";
dateParser.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
NSDate *specificMomentInTime = [dateParser dateFromString:[singleInstanceActivationHistoryDictionay objectForKey:@"ActivationTime"]];

// reformat converted Time to readable format
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"dd/MM/yy - hh:mm a";
dateFormatter.timeZone = [NSTimeZone defaultTimeZone];
NSString *dateWithNewFormat = [dateFormatter stringFromDate:specificMomentInTime];

NSLog(@"UTC ServerTime - %@", specificMomentInTime);
NSLog(@"NewFormat - %@", dateWithNewFormat);
person dreamlax    schedule 22.08.2013