दिलचस्प पोस्ट
यूआरएल फिर से लिखना के लिए फिर से लिखना-कोड मैं PHP में कॉलबैक कैसे लागू करूं? दृश्य स्टूडियो में बाहरी कक्षा पुस्तकालय परियोजनाओं को डिबग कैसे करें? टेक्स्टरेया में कैरेट की स्थिति कैसे प्राप्त करें, अक्षरों में, आरंभ से? जावास्क्रिप्ट; समान मूल के साथ टैब / विंडो के बीच संचार ओब्जेसी लिंकर फ्लैग क्या करता है? वेक्टर ड्रेनेबल – क्या यह एंड्रॉइड के प्री-लॉलीपॉप संस्करणों के लिए किसी तरह उपलब्ध है? वेब। एक्सएमएल का इस्तेमाल करते हुए वसंत में संदर्भ लोड करना एक ही बार में कई कॉलम कारकों पर केंद्रित करें जटिल पासवर्ड लागू करने के लिए नियमित अभिव्यक्ति, 4 नियमों में से 3 से मेल खाती है फ्यूजन यात्री और रेल का उपयोग करते समय धीमी प्रारंभिक सर्वर स्टार्टअप मैं setTimeout () कॉलबैक में एक पैरामीटर कैसे पास कर सकता हूं? मानचित्र की एक सूची छँटाई <String, String> R: ggplot2 बारप्लोट और त्रुटि बार कैसे एक पुनरावर्ती regexp अजगर में लागू किया जा सकता है?

आईओएस पर आईएसओ 8601 की तारीख कैसे प्राप्त करूं?

आईएसओ 8601 तिथि स्ट्रिंग (उदाहरण के लिए, 2004-02-12T15:19:21+00:00 ) की date('c') से PHP में प्राप्त करना काफी आसान है, लेकिन यह किसी को उद्देश्य-सी (आईफ़ोन )? क्या ऐसा करने के लिए एक समान रूप से छोटा रास्ता है?

यहाँ यह करने के लिए मुझे बहुत लंबा रास्ता मिल गया है:

 NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZ"; NSDate *now = [NSDate date]; NSString *formattedDateString = [dateFormatter stringFromDate:now]; NSLog(@"ISO-8601 date: %@", formattedDateString); // Output: ISO-8601 date: 2013-04-27T13:27:50-0700 

ऐसा लगता है कि इतनी केंद्रीय कुछ के लिए रिगमारोल का एक बहुत बड़ा कारण है।

Solutions Collecting From Web of "आईओएस पर आईएसओ 8601 की तारीख कैसे प्राप्त करूं?"

NSDateFormatter उपयोग करें:

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; NSLocale *enUSPOSIXLocale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]; [dateFormatter setLocale:enUSPOSIXLocale]; [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"]; NSDate *now = [NSDate date]; NSString *iso8601String = [dateFormatter stringFromDate:now]; 

और स्विफ्ट में:

 let dateFormatter = DateFormatter() let enUSPosixLocale = Locale(identifier: "en_US_POSIX") dateFormatter.locale = enUSPosixLocale dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ" let iso8601String = dateFormatter.string(from: Date()) 

माडी के जवाब के पूरक के रूप में, एक "Z" (जो कि आरएफसी 822 प्रारूप के लिए है) के बजाय आईओओ 8601 के लिए टाइम ज़ोन प्रारूप "ज़ेड ZZZZ" (5 गुना ज़ेड) होना चाहिए। आईओएस 6 पर कम से कम

( http://www.unicode.org/reports/tr35/tr35-25.html#Date_Format_Patterns देखें)

आईओएस 10 एक नया NSISO8601DateFormatter क्लास का परिचय करता है, जो कि सिर्फ यह संभालता है। यदि आप स्विफ्ट 3 का प्रयोग कर रहे हैं, तो आपका कोड ऐसा कुछ होगा:

 let formatter = ISO8601DateFormatter() let date = formatter.date(from: "2016-08-26T12:39:00Z") let string = formatter.string(from: Date()) 

तो एनएसडीटे पर सैम सफ़ी की श्रेणी का उपयोग यहां पाया गया । उस प्रोजेक्ट में जो कोड जोड़ा गया है, उसके बाद आप NSDate पर एक एकल विधि का उपयोग कर सकते हैं:

 - (NSString *)sam_ISO8601String 

न केवल यह एक पंक्ति है, जो एनएसडीटफ़ॉर्मर दृष्टिकोण से बहुत तेज है, क्योंकि इसके शुद्ध सी में लिखा गया है।

IS8601 से , समस्याएं प्रतिनिधित्व और समय क्षेत्र हैं

  • आईएसओ 8601 = year-month-day time timezone
  • तिथि और समय के लिए, मूल (YYYYMMDD, hhmms, …) और विस्तारित प्रारूप (YYYY-MM-DD, hh: mm: ss, …) हैं
  • समय क्षेत्र ज़ुलु, ऑफ़सेट या जीएमटी हो सकता है
  • तिथि और समय के लिए विभाजक अंतरिक्ष या T हो सकता है
  • तिथि के लिए सप्ताह प्रारूप हैं, लेकिन यह शायद ही कभी इस्तेमाल किया जाता है
  • टाइमज़ोन बहुत बाद में रिक्त स्थान हो सकता है
  • दूसरा वैकल्पिक है

यहां कुछ वैध तार हैं

 2016-04-08T10:25:30Z 2016-04-08 11:25:30+0100 2016-04-08 202530GMT+1000 20160408 08:25:30-02:00 2016-04-08 11:25:30 +0100 

समाधान की

  • कदम से कदम पार्स, जैसे ISO8601 soffes
  • मूल स्वरूप में कनवर्ट करें, जैसे onmyway133 ISO8601

NSDateFormatter

तो यहाँ प्रारूप है कि मैं onmyway133 ISO8601 में उपयोग कर रहा हूँ

 let formatter = NSDateFormatter() formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") formatter.dateFormat = "yyyyMMdd HHmmssZ" 

Z पहचानकर्ता दिनांक फ़ील्ड प्रतीक तालिका के बारे में

 Z: The ISO8601 basic format with hours, minutes and optional seconds fields. The format is equivalent to RFC 822 zone format (when optional seconds field is absent) 

लोकेल सेटिंग के उपयोग के बारे में locale फ़ॉर्मेटिंग डेटा

लोकेल किसी विशेष उपयोगकर्ता के लिए स्वरूपण विकल्पों का प्रतिनिधित्व करते हैं, न कि उपयोगकर्ता की पसंदीदा भाषा। ये अक्सर समान होते हैं लेकिन अलग-अलग हो सकते हैं उदाहरण के लिए, जर्मनी में रहने वाला एक देशी अंग्रेजी बोलने वाला भाषा अंग्रेज़ी और भाषा के रूप में जर्मनी का चयन कर सकता है

en_US_POSIX तकनीकी क्यू और ए क्यूए 1480 एनएसडीटफ़ॉर्मर और इंटरनेट तिथियों के बारे में

दूसरी तरफ, यदि आप निश्चित-प्रारूप तिथियों के साथ काम कर रहे हैं, तो आपको पहले दिनांक फ़ॉर्मेटर का लोकेल अपने निश्चित प्रारूप के लिए उचित निर्धारित करना चाहिए। ज्यादातर मामलों में सबसे अच्छा स्थान चुनना "en_US_POSIX" है, एक लोकेल जिसे उपयोगकर्ता और सिस्टम वरीयता दोनों पर ध्यान दिए बिना यू.एस. इंग्लिश परिणाम उत्पन्न करने के लिए डिज़ाइन किया गया है। "en_US_POSIX" समय में भी अपरिवर्तनीय है (यदि भविष्य में, कुछ समय पर अमेरिका, जिस तरह से इसे स्वरूपित करता है, बदलता है, "en_US" नए व्यवहार को प्रतिबिंबित करने के लिए बदल जाएगा, लेकिन "en_US_POSIX" नहीं होगा), और मशीनों के बीच ( "en_US_POSIX" ओएस एक्स पर ऐसा ही काम करता है, और जैसा कि यह अन्य प्लेटफार्मों पर करता है)।

दिलचस्प संबंधित quetions

  • एक आईएसओ 8601 टाइमस्टैम्प को एनएसडीट में परिवर्तित करना: यूटीसी समय ऑफसेट के साथ कैसे एक समझौता होता है?
  • क्यों NSDateFormatter आईएसओ 8601 प्रारूप से तारीख को पार्स नहीं कर सकता
  • मिलिसेकंड्स NSDateFormatter बिना मिलीमीटर से और बिना मिलीमीटर के ISO8601 को पार्स करने के लिए

इस सार के आधार पर: https://github.com/justinmakaila/NSDate-ISO-8601/blob/master/NSDateISO8601.swift , एनएसडीटे को आईएसओ 8601 दिनांक स्ट्रिंग को य्या-एमएम के प्रारूप में परिवर्तित करने के लिए निम्नलिखित विधि का उपयोग किया जा सकता है। -dd'T'HH: mm: ss.SSSZ

 -(NSString *)getISO8601String { static NSDateFormatter *formatter = nil; if (!formatter) { formatter = [[NSDateFormatter alloc] init]; [formatter setLocale: [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]]; formatter.timeZone = [NSTimeZone timeZoneWithAbbreviation: @"UTC"]; [formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS"]; } NSString *iso8601String = [formatter stringFromDate: self]; return [iso8601String stringByAppendingString: @"Z"]; } 

एक बार अनदेखी मुद्दा यह है कि आईएसओ 8601 प्रारूप में तार मिलसेकंड हो सकते हैं और शायद

दूसरे शब्दों में, "2016-12-31 टी 23: 59: 59.999 99 99" और "2016-12-01टी 00: 00: 00" दोनों कानूनी हैं, लेकिन यदि आप स्थिर-टाइप डेट फॉर्मेटर का उपयोग कर रहे हैं तो उनमें से एक को पार्स नहीं किया जाएगा ।

मुझे एक ऐसा जवाब नहीं मिल पाया है जिसमें दोनों मामलों और सार तत्वों को इस सूक्ष्म अंतर को दूर किया गया है। यहां समाधान है जो इसे संबोधित करता है:

 extension DateFormatter { static let iso8601DateFormatter: DateFormatter = { let enUSPOSIXLocale = Locale(identifier: "en_US_POSIX") let iso8601DateFormatter = DateFormatter() iso8601DateFormatter.locale = enUSPOSIXLocale iso8601DateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" iso8601DateFormatter.timeZone = TimeZone(secondsFromGMT: 0) return iso8601DateFormatter }() static let iso8601WithoutMillisecondsDateFormatter: DateFormatter = { let enUSPOSIXLocale = Locale(identifier: "en_US_POSIX") let iso8601DateFormatter = DateFormatter() iso8601DateFormatter.locale = enUSPOSIXLocale iso8601DateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'" iso8601DateFormatter.timeZone = TimeZone(secondsFromGMT: 0) return iso8601DateFormatter }() static func date(fromISO8601StringWithOptionalMilliseconds string: String) -> Date? { if let dateWithMilliseconds = iso8601DateFormatter.date(from: string) { return dateWithMilliseconds } if let dateWithoutMilliseconds = iso8601WithoutMillisecondsDateFormatter.date(from: string) { return dateWithoutMilliseconds } return nil } } 

उपयोग:

 let dateToString = "2016-12-31T23:59:59.9999999" let dateTo = DateFormatter.date(fromISO8601StringWithOptionalMilliseconds: dateToString) // dateTo: 2016-12-31 23:59:59 +0000 let dateFromString = "2016-12-01T00:00:00" let dateFrom = DateFormatter.date(fromISO8601StringWithOptionalMilliseconds: dateFromString) // dateFrom: 2016-12-01 00:00:00 +0000 

मैं भी दिनांक फ़ॉर्मेटर्स के बारे में एप्पल लेख की अनुशंसा करता हूं

यह थोड़ा आसान है और दिनांक को यूटीसी में डालता है।

 extension NSDate { func iso8601() -> String { let dateFormatter = NSDateFormatter() dateFormatter.timeZone = NSTimeZone(name: "UTC") let iso8601String = dateFormatter.stringFromDate(NSDate()) return iso8601String } } let date = NSDate().iso8601() 

स्विफ्ट 3.0 और आईओएस 9.0 का उपयोग करना

 extension Date { private static let jsonDateFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ" formatter.locale = Locale(identifier: "en_US_POSIX") formatter.timeZone = TimeZone(identifier: "UTC")! return formatter }() var IOS8601String: String { get { return Date.jsonDateFormatter.string(from: self) } } init?(fromIOS8601 dateString: String) { if let d = Date.jsonDateFormatter.date(from: dateString) { self.init(timeInterval: 0, since:d) } else { return nil } } }