自动再生订阅收据的日期格式
问题描述:
我竭力要弄清楚格式以下日期:自动再生订阅收据的日期格式
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,我能想到的。任何见解?
答
通过查看日期格式的文档,我得到了正确的格式,是很适合我:
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
答
做一些更多的研究后,我在这里使用的代码工作,但犯罪嫌疑人;
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”
然而,问题仍然是有效的,你有恢复的订阅工作时使用的购买日期字段,这个字段是你所描述的文本格式。
答
这是我做的雨燕上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!)
你有任何这方面的喜悦?当我遇到你的问题时,我即将发布相同的问题。 – Roger 2011-06-13 18:01:31
有没有其他人的事情奇怪,苹果返回这个字符串,但苹果框架无法解析它? – 2013-02-06 10:32:24
不,但那很大程度上是因为我几年来一直在使用Apple技术。一段时间后你会习惯这种痛苦。 – Hyperbole 2013-02-06 17:27:55