2011-05-31 32 views
13

我竭力要弄清楚格式以下日期:自動再生訂閱收據的日期格式

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

這個日期是從蘋果公司的收據驗證服務返回的,我需要把它變成一個NSDate進行一些比較操作。真正的麻煩與時區有關。

下面是一些代碼,我已經寫:

 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]; 

我試過「和v的」的所有組合個Z,我能想到的。任何見解?

+0

你有任何這方面的喜悅?當我遇到你的問題時,我即將發佈相同的問題。 – Roger 2011-06-13 18:01:31

+0

有沒有其他人的事情奇怪,蘋果返回這個字符串,但蘋果框架無法解析它? – 2013-02-06 10:32:24

+0

不,但那很大程度上是因爲我幾年來一直在使用Apple技術。一段時間後你會習慣這種痛苦。 – Hyperbole 2013-02-06 17:27:55

回答

14

通過查看日期格式的文檔,我得到了正確的格式,是很適合我:

 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"]]; 

沒有必要,因爲它是嵌入在字符串中設置時區的格式。
操縱日期字符串分析它是不是一個好主意。

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

+0

這個作品我不會像接受的答案那樣去除時區。您應該切換日期和月份:yyyy-dd-MM => yyyy-MM-dd – null 2014-07-09 00:48:12

+0

日期格式已修復!謝謝 – Yariv 2014-07-24 18:40:51

+0

出於某種原因,此格式不適用於在以色列購買的客戶:O – Joey 2017-04-14 20:38:45

3

做一些更多的研究後,我在這裏使用的代碼工作,但犯罪嫌疑人;

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]; 

我不喜歡我在做關於傳入日期字符串的假設,因此我假定這代碼可能打破其他商店(我測試反對英國的一個)。因此,儘管這種方式適用於我自己的情況,但我真的很希望看到一個更健壯的解決方案,它可以根據原始問題正確解析時區字符串。

我不太相信蘋果已經使用了過時時區(所有ETC/*那些被正式棄用)在​​這些重要的日期字符串!

編輯:

我注意到您使用

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

這實際上不是一個字符串according to the documentation它應該是「認購收據的截止日期,表示爲毫秒數自1月1日,1970年00:00:00 GMT」

然而,問題仍然是有效的,你有恢復的訂閱工作時使用的購買日期字段,這個字段是你所描述的文本格式。

+0

倒票的驅動器是什麼? – Roger 2011-06-14 13:14:45

+0

我最後做同樣的查找/在我的代碼代替,但我取代了「ETC/GMT」與「GMT」,使我的生活更容易一點。另外,我對你使用這個解決方案有同樣的保留,但坦率地說,我找不到任何可以工作的東西。感謝您確認我的解決方案。 – Hyperbole 2011-06-14 23:15:22

+0

感謝您的更新! – Roger 2011-06-14 23:20:07

0

這是我做的雨燕上3日從收據自動再生日期轉換。

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!)