2010-01-25 16 views
39

मेरे पास एक उलटी गिनती टाइमर है जो वर्तमान दिनांक/समय से किसी विशिष्ट भविष्य की तारीख/समय तक गिना जाता है। यह एक समस्या को छोड़कर महान काम कर रहा है। मैं NSDateFormatter और dateFromString का उपयोग कर भविष्य की तारीख इनपुट करता हूं। ऐसा लगता है कि यह 12 से अधिक समय (घंटा) स्वीकार करने में सक्षम नहीं है, हालांकि यह दर्शाता है कि यह 24 घंटे की घड़ी का समर्थन नहीं करता है। 24 घंटों के घड़ी के समर्थन या कामकाज को सक्षम करने का कोई तरीका है?24 घंटे के साथ NSDateFormatter

NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"yyyy-MM-dd hh:mm:ss"]; 
NSDate *myDate = [df dateFromString:@"2010-03-14 15:00:00"]; 

धन्यवाद

+0

क्या स्थानीयकरण के बारे में ...? क्या आपको पहले 'NSDateFormatter' को स्थानीय रूप से स्थानांतरित नहीं करना चाहिए था? – holex

उत्तर

63

NSDateFormatter Unicode standard for date and time patterns इस प्रकार है: यहाँ मेरी कोड के कुछ है। एक 24 घंटे की घड़ी पर घंटे के लिए "एच" का उपयोग करें:

NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
NSDate *myDate = [df dateFromString:@"2010-03-14 15:00:00"]; 
+37

यह उपयोगकर्ता काम नहीं करता है अगर उपयोगकर्ता 24 घंटे बंद कर देता है। –

+4

आश्चर्यजनक नहीं है? मैंने अभी पाया है कि मेरे स्वयं के ऐप्स विफल हो रहे थे क्योंकि प्रारूप स्ट्रिंग में एचएच का उपयोग करने के बावजूद, उपयोगकर्ता सेटिंग इसे ओवरराइड करती है। पागल! – Roger

+1

यह उत्तर भ्रामक है। मैं मैविक 3 और रोजर से सहमत हूं। उपयोगकर्ता सेटिंग मानक समय पैटर्न के एचएच को ओवरराइड करता है। दिनांक स्वरूपक दस्तावेज़ीकरण, इस व्यवहार पर कष्टप्रद संकेत देता है: सभी मामलों में, आपको उपयोगकर्ता के वरीयता सेटिंग्स के साथ उपयोगकर्ता के लोकेल (currentLocale) का उपयोग करने के लिए डिफ़ॉल्ट रूप से उस स्वरूपक को विचार करना चाहिए। – user363349

49

मैं एक ही समस्या थी और एचएच का उपयोग कर कुछ उपकरणों पर केवल काम किया, रोजर इसकी भी पुष्टि की तरह। अंत में यह समाधान था जो मेरे लिए काम करता था, मुझे आशा है कि यह दूसरों के लिए काम करेगी। इस उत्तर को ढूंढना मुश्किल था, इसके साथ कोई मंच नहीं है, यह सचमुच परीक्षण और एप्पल दस्तावेज के बाद त्रुटि थी।

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; 

    [dateFormatter setLocale:enUSPOSIXLocale]; 

    NSString *dateFormat = @"dd/mm/yyyy HH:mm"; 

    [dateFormatter setDateFormat:dateFormat]; 
    [dateFormatter setTimeZone:[NSTimeZone localTimeZone]]; 
    date = [dateFormatter dateFromString:string]; 
+0

धन्यवाद, दोस्त। चाल है – Felipe

+0

अभी तक यह पूरी तरह से काम कर रहा है। धन्यवाद। – vaticRite

+0

इसे उत्तर के रूप में चिह्नित किया जाना चाहिए। यह पूरी तरह से काम करता है। – aramusss

2

मैं NSDateFormatter नजरअंदाज कर दिया hhHH के बजाय हाल ही में एक ऐसी ही समस्या थी,,, a (AM/PM प्रतीक) और G (चक्रीय युग नाम) मेरे एप्लिकेशन में।

और मुझे आश्चर्य हुआ कि अगर मैं अपने डिवाइस की स्थानीयकरण सेटिंग में जाता हूं और कुछ यादृच्छिक पसंद करता हूं, तो सभी freaks चले गए हैं और त्रुटि फिर से उत्पादित नहीं किया जा सकता है। बहुत अजीब।

फिर मैंने सिम्युलेटर पर कुछ अध्ययन करने के लिए परीक्षण किया।

के बाद आप NSDateFormatter बनाया है, स्पष्ट रूप से वातावरण संपत्ति भी उपयोगकर्ता सेटिंग द्वारा निर्धारित आप वर्तमान स्थान का उपयोग कर रहे हैं, और अधिक महत्वपूर्ण बात, [NSLocale currentLocale] का उपयोग नहीं करते, यह एक bugged है और किसी भी तरह "ओवरराइड" हो सकता है: मेरे समाधान है , systemLocale का उपयोग करें या स्पष्ट रूप से एक स्थानीय पहचान का उपयोग कर NSLocale उदाहरण बनाएं।

6

स्विफ्ट पर मेरे समाधान:

let formatter = NSDateFormatter() 
var defIdentifer = formatter.locale.localeIdentifier 
if !defIdentifer.hasSuffix("_POSIX") { 
    defIdentifer = defIdentifer+"_POSIX" 
    let locale = NSLocale(localeIdentifier: defIdentifer) 
    formatter.locale = locale 
} 
formatter.dateFormat = "HH:mm" 
+0

बहुत बढ़िया जवाब! यही वह था जिसे मैं ढूंढ रहा था। – Rados

4

NSDateFormatters पर Apple Technical Q&A से लिया

प्रश्न: क्या मैं एक इंटरनेट-शैली तारीख को पार्स करने NSDateFormatter उपयोग कर रहा हूँ, लेकिन इस में कुछ उपयोगकर्ताओं के लिए विफल रहता है कुछ क्षेत्रों मैंने एक विशिष्ट दिनांक प्रारूप स्ट्रिंग सेट की है; क्या एनएसडीएटीफॉर्मेटर को उपयोगकर्ता की क्षेत्र सेटिंग्स से स्वतंत्र रूप से काम करने के लिए मजबूर नहीं करना चाहिए?

एक: एक तिथि प्रारूप स्ट्रिंग की स्थापना अधिकांश उपयोगकर्ताओं के लिए काम करने के लिए दिखाई देगा नहीं। है, यह इस समस्या का सही समाधान नहीं है। ऐसे कई स्थान हैं जहां प्रारूप तार अनपेक्षित तरीकों से व्यवहार करते हैं।

यह मैं कैसे मेरा स्विफ्ट में किया है:

private let dateFormatter: NSDateFormatter = { 
    let dateFormatter = NSDateFormatter() 
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" 
    dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") 
    dateFormatter.timeZone = NSTimeZone.init(forSecondsFromGMT: 0) 
    return dateFormatter 
}() 
+0

धन्यवाद लड़का। यह बहुत अच्छा काम करता है !!! –

0

24-घंटे स्ट्रिंग से NSDate हो रही है जब उपयोगकर्ता को स्थान बदलने और समय क्षेत्र की स्थापना के बिना अपने iPhone पर 12 घंटे के प्रारूप की स्थापना की है का उद्देश्य सी संस्करण :

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
NSString *localeId = dateFormatter.locale.localeIdentifier; 
if (! [localeId hasSuffix:@"_POSIX"]) { 
    localeId = [localeId stringByAppendingString:@"_POSIX"]; 
    dateFormatter.locale = [NSLocale localeWithLocaleIdentifier:localeId]; 
} 
dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH.mm.ss"; 

NSDate *date = [dateFormatter dateFromString:dateText]; 
संबंधित मुद्दे