2011-05-31 24 views
13

Aşağıdaki tarih için biçimlendirme anlamaya mücadele ediyorum: Bu tarih Apple'ın makbuz doğrulama hizmetinden döndürülenOtomatik yenilenebilir abonelik makbuz tarih biçimini

2011-05-24 19:02:32 Etc/GMT

ve ben çevirmek gerekir Bazı karşılaştırma işlemleri için NSDate. Asıl sorun saat dilimi ile ilgilidir. Bütün kombinasyonlarını 'v en ve' Z'nin en Aklıma o denedim

 NSDictionary *receiptData = [info valueForKey:@"expires_date"]; 

     NSDateFormatter *f = [[NSDateFormatter alloc] init]; 

     [f setLocale:[NSLocale currentLocale]]; 
     [f setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 
     [f setDateFormat:@"yyyy-MM-dd HH:mm:ss vvvv"]; 

     NSLog(@"%@", [f stringFromDate:[NSDate date]]); 

     NSDate *subPurchaseDate = [f dateFromString:[receiptData valueForKey:@"original_purchase_date"]]; 

     [f release]; 

:

İşte ben zaten yazdım bazı kod. Herhangi bir anlayış?

+0

Bunun ile ilgili bir neşeniz var mı? Seninle karşılaştığımda aynı soruyu göndermek üzereydim. – Roger

+0

Apple'ın bu dizgeyi döndürmesi garip bir şey var mı ama Apple altyapıları onu ayrıştıramaz mı? –

+0

Hayır, ancak bu büyük ölçüde Apple teknolojisi ile birkaç yıldır çalışıyorum. Bir süre sonra acıya alışırsın. – Hyperbole

cevap

14

Benim için iyi işler geçerli:

 NSDateFormatter * formatter = [NSDateFormatter new]; 
     formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss VV"; 

     NSDate * purchaseDate = [formatter dateFromString:latestTransaction[@"original_purchase_date"]]; 
     NSDate * expirationDate = [formatter dateFromString:latestTransaction[@"expires_date"]]; 

o dizede gömülü beri Formatlayıcıdaki saat dilimini ayarlamak gerek yok.
Tarih dizesini ayrıştırmak için işlem yapmak iyi bir fikir değildir.

Kaynak: http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_Patterns

+0

'un altındaki cevabıma bakın. Bu çalışma, kabul edilen yanıtın yaptığı gibi saat dilimini kaldırmaz. Gün ve ay değiştirmelisiniz: yyyy-dd-MM => yyyy-MM-dd – null

+0

tarih formatı düzeltildi! Teşekkürler – Yariv

+0

Bazı nedenlerle, bu biçim İsrail'de satın alan müşteriler için çalışmaz: O – Joey

3

Daha fazla araştırma yaptıktan sonra, burada kullandığım kod çalışır, ancak şüphelidir;

NSString *purchaseDateString = [@"2011-05-24 19:02:32 Etc/GMT" stringByReplacingOccurrencesOfString:@" Etc/GMT" withString:@""]; 
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    NSLocale *POSIXLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]; 
    [formatter setLocale:POSIXLocale]; 
    [formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 

    NSDate *purchaseDate = [formatter dateFromString:purchaseDateString]; 

Ben gelen tarih dizesi hakkında yapıyorum varsayımları sevmiyorum ve bu yüzden bu kod varsayıyorum diğer mağazalardan (Ben İngiltere'de bir karşı test ediyorum) için kırılabilir. Bu nedenle, kendi durumum için bu tür işler olsa da, aslında orijinal soruya göre zaman dilimini doğru olarak ayrıştıran daha sağlam bir çözüm görmek isterim.

Apple'ın bu önemli tarih dizelerinde onaylanmamış bir saat dilimi (tüm Vb/resmi olarak onaylanmış) kullandığını düşünemiyorum!

DÜZENLEME:

Ben bunu "abonelik alındığı son kullanma tarihi olmalıdır Bu aslında bir dize according to the documentation değil

NSDictionary *receiptData = [info valueForKey:@"expires_date"]; 

kullanırken dikkat 1 Ocak yana geçen milisaniye sayısı olarak ifade edilen , 1970, 00:00:00 GMT "

Yine de, geri yüklenen aboneliklerle çalışırken satın alma_tarihi alanını kullanmanız gerektiğinden ve bu alan açıkladığınız metin biçimindeyken soru hala geçerli. Ben doğru biçimi var tarih formatı belgelerine bakarak

+0

Tahsis edilen oylamada ne var? – Roger

+0

Kodumda aynı bulma/değiştirme işlemini yaptım ama hayatımı biraz daha kolaylaştırmak için 'GMT' ile 'Etc/GMT' değiştirdim.Ayrıca, bu çözümü kullanmakla ilgili olarak aynı rezervasyonları yaptım, ama açıkçası işe yarayacak başka bir şey bulamıyorum. Çözümü doğruladığın için teşekkürler. – Hyperbole

+0

Güncelleme için teşekkürler! – Roger

0

Bu benim bir makbuz otomatik yenilenebilir tarih arasında dönüştürmek için Swift 3 şey bu.

let expirationDate = "2017-08-16 23:10:35 Etc/GMT" 
let receiptDateFormat = "yyyy-MM-dd HH:mm:ss VV" 
let theDateFormat = DateFormatter.Style.medium 
let theTimeFormat = DateFormatter.Style.medium 
let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = receiptDateFormat 
let firstDate = dateFormatter.date(from: stringDate) 
dateFormatter.dateStyle = theDateFormat 
dateFormatter.timeStyle = theTimeFormat 

let result = dateFormatter.string(from: firstDate!) 
İlgili konular