自动再生订阅收据的日期格式

问题描述:

我竭力要弄清楚格式以下日期:自动再生订阅收据的日期格式

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

通过查看日期格式的文档,我得到了正确的格式,是很适合我:

 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

做一些更多的研究后,我在这里使用的代码工作,但犯罪嫌疑人;

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

这是我做的雨燕上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!)