2011-05-31 21 views
13

मैं निम्नलिखित तिथि के लिए स्वरूपण यह पता लगाने के लिए संघर्ष कर रहा हूँ:स्वत: अक्षय सदस्यता रसीद दिनांक स्वरूप

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

इस तिथि एप्पल रसीद सत्यापन सेवा से लौट आता है और मैं इसे एक में बदलने के लिए की जरूरत है कुछ तुलना संचालन के लिए एनएसडीएट। वास्तविक समस्या टाइमज़ोन से संबंधित है।

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

मैं के सभी संयोजनों 'वी के और' जेड के मैं के बारे में सोच सकते हैं कि कोशिश की है:

यहाँ कुछ कोड मैं पहले से ही लिखा गया है। कोई अंतर्दृष्टि?

+0

क्या आपको इससे कोई खुशी मिली? जब मैं आपके पास आया तो मैं वही प्रश्न पोस्ट करने वाला था। – Roger

+0

क्या कोई और यह अजीब बात करता है कि ऐप्पल इस स्ट्रिंग को लौटाता है लेकिन ऐप्पल फ्रेमवर्क इसे पार्स नहीं कर सकता है? –

+0

नहीं, लेकिन यह काफी हद तक है क्योंकि मैं कुछ वर्षों से ऐप्पल प्रौद्योगिकी के साथ काम कर रहा हूं। थोड़ी देर के बाद आप दर्द के लिए उपयोग करते हैं। – Hyperbole

उत्तर

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

+0

दिनांक प्रारूप तय! धन्यवाद – Yariv

+0

किसी कारण से, यह प्रारूप उन ग्राहकों के लिए काम नहीं करता है जो इज़राइल में खरीदते हैं: O – Joey

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

मैं मान्यताओं मैं भेजे दिनांक स्ट्रिंग के बारे में बनाने रहा पसंद नहीं है और इसलिए मैं इस कोड को संभालने हूँ अन्य दुकानों (मैं ब्रिटेन से एक के खिलाफ परीक्षण कर रहा हूँ) के लिए टूट सकता है। तो हालांकि इस तरह की काम मेरी खुद की स्थिति के लिए, मैं वास्तव में एक और मजबूत समाधान देखना चाहता हूं जो वास्तव में मूल प्रश्न के अनुसार टाइमज़ोन स्ट्रिंग को सही ढंग से पार करता है।

मुझे विश्वास नहीं है कि ऐप्पल ने इन महत्वपूर्ण तारीख तारों में एक बहिष्कृत टाइमज़ोन (सभी एटीसी/* लोगों को आधिकारिक तौर पर बहिष्कृत कर दिया है) का उपयोग किया है!

संपादित करें:

मैं तुम्हें

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

उपयोग कर रहे हैं यह "होना चाहिए सदस्यता प्राप्ति की समय सीमा समाप्ति दिनांक यह वास्तव में एक स्ट्रिंग according to the documentation नहीं है ध्यान दें, 1 जनवरी के बाद से मिलीसेकेंड की संख्या के रूप में व्यक्त , 1 9 70, 00:00:00 जीएमटी "

हालांकि प्रश्न अभी भी मान्य है क्योंकि आपको पुनर्स्थापित सदस्यता के साथ काम करते समय buy_date फ़ील्ड का उपयोग करना है और यह फ़ील्ड आपके द्वारा वर्णित पाठ प्रारूप में है।

+0

डाउन वोट द्वारा ड्राइव के साथ क्या है? – Roger

+0

मैंने अपने कोड में वही खोज/प्रतिस्थापन करना समाप्त कर दिया, लेकिन मैंने अपना जीवन थोड़ा आसान बनाने के लिए 'एटीसी/जीएमटी' को 'जीएमटी' के साथ बदल दिया।इसके अतिरिक्त, मेरे पास इस समाधान का उपयोग करने के बारे में आपके पास समान आरक्षण था, लेकिन स्पष्ट रूप से मुझे कुछ भी नहीं मिला जो काम करेगा। मेरे समाधान की पुष्टि के लिए धन्यवाद। – Hyperbole

+0

अद्यतन के लिए धन्यवाद! – Roger

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!) 
संबंधित मुद्दे