18

次の日付のフォーマットを理解するのに苦労しています。

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

この日付はAppleのレシート検証サービスから返され、いくつかの比較操作のために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」のすべての組み合わせを試しました。何か洞察はありますか?

4

4 に答える 4

16

日付形式のドキュメントを見ると、正しい形式がわかりました。これは私にとってうまく機能します。

        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

于 2014-06-06T23:04:18.637 に答える
4

さらに調査を行った後、ここで使用しているコードは機能しますが、疑わしいものです。

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

着信日文字列について行っている仮定が気に入らないため、このコードが他のストアでは機能しない可能性があると想定しています(英国のストアに対してテストしています)。したがって、この種の機能は私自身の状況では機能しますが、元の質問に従って実際にタイムゾーン文字列を正しく解析する、より堅牢なソリューションが本当に必要です。

Appleがこれらの重要な日付文字列で非推奨のタイムゾーン(すべてのEtc / *のものは正式に非推奨)を使用したとは信じられません!

編集:

私はあなたが使用していることに注意します

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

これは、ドキュメントによると実際には文字列ではなく、「サブスクリプションレシートの有効期限。1970年1月1日00:00:00GMTからのミリ秒数として表されます」である必要があります。

ただし、復元されたサブスクリプションを操作する場合はpurchase_dateフィールドを使用する必要があり、このフィールドは説明したテキスト形式であるため、質問は引き続き有効です。

于 2011-06-13T19:00:19.857 に答える
1

次のコードを使用して、 AppStoreの領収書にあるRFC3339の日付を解析できます。

let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss VV"
formatter.timeZone = TimeZone(secondsFromGMT: 0)

let date = formatter.date(from: "2020-06-17 10:59:33 Etc/GMT")

と同様にを設定する必要があることに注意してください。また、 Technical Q&A QA1480によると、前の設定も重要です。timeZonelocalelocaledateFormat

AppleはISO8601DateFormatter、 iOS10以降およびmacOS10.12+で新しいAPIを使用することをお勧めします。

于 2020-05-23T10:59:39.300 に答える
0

これは、Swift 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!)
于 2017-08-17T23:45:27.090 に答える