2009-12-18 14 views
37

मैंने सोचा कि मैंने हाल ही में कुछ जवाब देने को देखा है लेकिन अब मुझे यह नहीं मिल रहा है। यह कोड यह निर्धारित करने के लिए है कि सेटिंग्स 24 घंटों के समय के प्रदर्शन के लिए है या नहीं। यह अमेरिका में मेरे लिए काम करता है, लेकिन मुझे नहीं पता कि यह सभी इलाकों में काम करेगा या नहीं। क्या यह पर्याप्त है या इसके लिए वर्तमान सेटिंग जानने का एक बेहतर तरीका है?मैं कैसे निर्धारित कर सकता हूं कि आईफोन 12 घंटे या 24 घंटे के समय के लिए सेट है या नहीं?

+(BOOL) use24HourClock 
{ 
    BOOL using24HourClock = NO; 

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];  
    [dateFormatter setLocale: [NSLocale currentLocale]];  
    [dateFormatter setDateStyle:kCFDateFormatterNoStyle]; 
    [dateFormatter setTimeStyle:kCFDateFormatterShortStyle];  
    // get date/time (1Jan2001 0000UTC) 
    NSDate* midnight = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:0]; 
    NSString* dateString = [dateFormatter stringFromDate: midnight]; 
    // dateString will either be "15:00" or "16:00" (depending on DST) or 
    // it will be "4:00 PM" or "3:00 PM" (depending on DST) 
    using24HourClock = ([dateString length] == 5); 
    [midnight release]; 
    [dateFormatter release];  

    return using24HourClock; 
} 

उत्तर

77

यहाँ यह करने के लिए सबसे अच्छा तरीका है। ICU Spec, "j" ... लोकेल (ज, एच, कश्मीर, या ट) के लिए

अनुरोध पसंदीदा घंटे के स्वरूप, के रूप में द्वारा ज, एच, कश्मीर, या कश्मीर प्रयोग किया जाता है कि क्या निर्धारित के अनुसार लोकेल के लिए मानक शॉर्ट टाइम प्रारूप में। ऐसे एपीआई के कार्यान्वयन में, 'j' को उपलब्ध Formats डेटा के खिलाफ एक मैच शुरू करने से पहले एच, एच, के, या के द्वारा प्रतिस्थापित किया जाना चाहिए। ध्यान दें कि एपीआई को पास किए गए कंकाल में 'जे' का उपयोग एक कंकाल का एकमात्र तरीका है जो लोकेल के पसंदीदा समय चक्र प्रकार (12-घंटे या 24 घंटे) का अनुरोध करता है।

वह अंतिम वाक्य महत्वपूर्ण है। यह "एक कंकाल अनुरोध करने का एकमात्र तरीका है जो लोकेल के पसंदीदा समय चक्र प्रकार का अनुरोध करता है"। चूंकि NSDateFormatter और NSCalendar आईसीयू लाइब्रेरी पर बनाए गए हैं, वही यहां सच है।

+0

अच्छा 3-लाइनर। मैं सोच रहा हूं, "ए" के लिए वास्तव में क्या खड़ा है?क्या यह संभव है कि कुछ गुप्त सेटिंग समय-चक्र प्रतीक को "एएम" में बदल सके? क्या रेंज लाइन को में बदल दिया जाना चाहिए NSRange includeA = [formatStringForHours rangeOfString: @ "a" विकल्प: NSCaseInsensitiveSearch]; '? – Wienke

+3

@Wienke "ए" एएम/पीएम डिजाइनर के लिए आईसीयू प्रतीक है। यह कभी भी "ए" नहीं हो सकता है, क्योंकि आईसीयू "ए" का उपयोग कुछ अलग करने के लिए करता है (दिन में मिलीसेकंड)। –

+0

+1, मुझे लगता है कि एक ऐसे चरित्र के लिए खोज करने में अधिक आरामदायक तरीका है जिसमें परिभाषित निश्चित अर्थ है और लोकेल के आधार पर नहीं बदलेगा। – DarkDust

21

मैं बस यहाँ पर एक similar question पूछा है और मैं एक छोटे से समारोह मैं NSLocale की एक श्रेणी में शामिल किया है के साथ इस का निर्धारण करने का एक सभ्य तरीका यह पता लगाने की प्रबंधित किया है। यह बहुत सटीक प्रतीत होता है और कई क्षेत्रों के साथ परीक्षण करते समय इसके साथ कोई समस्या नहीं मिली है।

@implementation NSLocale (Misc) 
- (BOOL)timeIs24HourFormat { 
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    [formatter setLocale:self]; 
    [formatter setDateStyle:NSDateFormatterNoStyle]; 
    [formatter setTimeStyle:NSDateFormatterShortStyle]; 
    NSString *dateString = [formatter stringFromDate:[NSDate date]]; 
    NSRange amRange = [dateString rangeOfString:[formatter AMSymbol]]; 
    NSRange pmRange = [dateString rangeOfString:[formatter PMSymbol]]; 
    BOOL is24Hour = (amRange.location == NSNotFound && pmRange.location == NSNotFound); 
    [formatter release]; 
    return is24Hour; 
} 
@end 

आशा है कि इससे मदद मिलती है!

NSString *formatStringForHours = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]]; 

NSRange containsA = [formatStringForHours rangeOfString:@"a"]; 
BOOL hasAMPM = containsA.location != NSNotFound; 
स्विफ्ट में

:

let formatString: NSString = NSDateFormatter.dateFormatFromTemplate("j", options: 0, locale: NSLocale.currentLocale())! 
let hasAMPM = formatString.containsString("a") 

यह एक विशेष तिथि टेम्पलेट स्ट्रिंग "j" कहा जाता है का उपयोग करता है

+0

इस श्रेणी विधि के साथ एक छोटी सी समस्या है। आपको एक पंक्ति '[फॉर्मेटर सेट लोकेले: स्वयं] जोड़ना चाहिए;' फ़ॉर्मेटर के निर्माण के ठीक बाद, अन्यथा यह ** केवल ** वर्तमान लोकेल का उपयोग करता है। –

+0

ओह हाँ, अच्छी जगह! –

+0

कोई समस्या नहीं। बीटीडब्ल्यू, महान समाधान, मुझे इसका उपयोग करने में खुशी है। –

6

मैं एक शॉट डेव जवाब दिया, लेकिन जब जर्मन स्थान के साथ परीक्षण - एक क्षेत्र में, जहां 24 घंटे समय चक्र प्रयोग किया जाता है - मुझे एहसास हुआ कि यह बेहतर हो एच या कश्मीर प्रारूप स्ट्रिंग में जांच करने के लिए होगा के बजाय , और उद्धृत सबस्ट्रिंग को अनदेखा किया जाना चाहिए।

जर्मन लोकेल के लिए मैं आईओएस सिम्युलेटर में टेम्पलेट "जे" के लिए प्रारूप प्रारूप का अनुरोध करते समय "एचएच ए" वापस प्राप्त करता हूं, और डिवाइस पर "एचएच 'उहर"। (समझ में नहीं आता है क्यों वहाँ एक अंतर बिल्कुल है।)

यहाँ NSLocale के लिए एक वर्ग है कि मैं 24 घंटे समय चक्र के लिए जाँच करने के लिए उपयोग करते हैं:

@interface NSLocale (TwentyFourHourTimeCycleCheck) 

- (BOOL)uses24HourTimeCycle; 

@end 

@implementation NSLocale (TwentyFourHourTimeCycleCheck) 

- (BOOL)uses24HourTimeCycle 
{ 
    BOOL uses24HourTimeCycle = NO; 

    NSString *formatStringForHours = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:self]; 
    NSScanner *symbolScanner = [NSScanner scannerWithString:formatStringForHours]; 

    NSString *singleQuoteCharacterString = @"'"; 

    // look for single quote characters, ignore those and the enclosed strings 
    while (![symbolScanner isAtEnd]) { 

     NSString *scannedString = @""; 
     [symbolScanner scanUpToString:singleQuoteCharacterString intoString:&scannedString]; 

     // if 'H' or 'k' is found the locale uses 24 hour time cycle, and we can stop scanning 
     if ([scannedString rangeOfString:@"H"].location != NSNotFound || 
      [scannedString rangeOfString:@"k"].location != NSNotFound) { 

      uses24HourTimeCycle = YES; 

      break; 
     } 

     // skip the single quote 
     [symbolScanner scanString:singleQuoteCharacterString intoString:NULL]; 
     // skip everything up to and including the next single quote 
     [symbolScanner scanUpToString:singleQuoteCharacterString intoString:NULL]; 
     [symbolScanner scanString:singleQuoteCharacterString intoString:NULL]; 
    } 

    return uses24HourTimeCycle; 
} 

@end 
+0

इसे साझा करने के लिए धन्यवाद, यह वास्तव में "एचएच 'उहर" कहता है जब जर्मन लोकेल में 24 घंटे की घड़ी पर। तो इसके साथ हम एक संभावना का सुझाव दे रहे हैं कि कुछ भाषा कुछ ऐसी चीज वापस कर सकती है जिसमें 24 घंटे के प्रारूप में भी "ए" है? –

0

स्विफ्ट 4 में:

let formatString: String = DateFormatter.dateFormat(fromTemplate: "j", options: 0, locale: Locale.current)! 
let hasAMPM = formatString.contains("a") 
संबंधित मुद्दे