سؤال

أحاول طباعة التاريخ بتنسيق معين:

NSDate *today = [[NSDate alloc] init];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyyMMddHHmmss"];
NSString *dateStr = [dateFormatter stringFromDate:today];

إذا تم ضبط iPhone على توقيت 24 ساعة، فسيعمل هذا بشكل جيد، وإذا قام المستخدم من ناحية أخرى بضبطه على توقيت 24 ساعة، فعد إلى AM/PM (يعمل بشكل جيد حتى تقوم بتبديل هذا الإعداد) ثم يقوم بإلحاق AM /PM في النهاية على الرغم من أنني لم أطلب ذلك:

20080927030337 PM

هل أفعل شيئًا خاطئًا أم أن هذا خطأ في البرنامج الثابت 2.1؟

تحرير 1:جعل الوصف أكثر وضوحا

تعديل الحل 2:اتضح أن هذا خطأ، ولإصلاحه قمت بتعيين الأحرف AM و PM على "":

[dateFormatter setAMSymbol:@""];
[dateFormatter setPMSymbol:@""];
هل كانت مفيدة؟

المحلول

باستخدام الكود الذي نشرته على كل من جهاز المحاكاة والهاتف مع البرنامج الثابت 2.1 وضبط الوقت على مدار 24 ساعة على إيقاف التشغيل، لم ألحق AM/PM مطلقًا بـ dateStr عندما أفعل:

NSLog(@"%@", dateStr);

هل تفعل أي شيء آخر باستخدام dateStr لم تنشره هنا؟كيف يتم التحقق من القيمة؟

متابعة

حاول تشغيل الإعداد صباحًا/مساءً ثم إيقاف تشغيله.ولم يكن لدي مشكلة أيضًا، حتى فعلت ذلك.انا اطبعها بنفس طريقتك

حسنًا، أرى ذلك عندما أفعل هذا أيضًا.يجب أن يكون خطأ.أنا أوصيك تقديم تقرير الشوائب وما عليك سوى التحقق من الأحرف غير المرغوب فيها وتصفيتها في هذه الأثناء.

نصائح أخرى

سبب هذا السلوك هو اللغة، فهو يقوم بتعيين اللغة الصحيحة.

قم بتعيين المحلي الخاص بك NSDateFormatter ل ar_US_POSIX سوف يصلح هذا.إنه يعمل بتنسيق 24 ساعة و 12 ساعة.

On iPhone OS, the user can override the default AM/PM versus 24-hour time setting (via Settings > General > Date & Time > 24-Hour Time), which causes NSDateFormatter to rewrite the format string you set. من وثيقة التفاح

جرب هذا،

NSDate *today = [[NSDate alloc] init];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
[dateFormatter setDateFormat:@"yyyyMMddHHmmss"];
NSString *dateStr = [dateFormatter stringFromDate:today];

إليك شرح خطأ iPhone SDK (لا يزال موجودًا أيضًا في الإصدار 3.1 بيتا SDK)

أولاً، خلفية بسيطة عن واجهة مستخدم iPhone.عندما يغير مستخدمو iPhone تنسيق منطقتهم ، على سبيل المثال ، "الولايات المتحدة" و "فرنسا" ، يتم تحويل إعداد المستخدم "لمدة 24 ساعة" تلقائيًا إلى الوضع الأكثر انتشارًا في تلك المنطقة.في فرنسا ، من شأن ذلك أن يحدد الوقت على مدار 24 ساعة لـ "ON" ، وفي الولايات المتحدة ، من شأنه أن يضعه على "OFF".يمكن للمستخدمين بعد ذلك تجاوز هذا الإعداد يدويًا وهذا هو المكان الذي تبدأ فيه المشكلة.

تأتي المشكلة من NSDAteFormatter بطريقة ما "التعثر" في وضع الوقت 12 أو 24 ساعة الذي اختاره المستخدم يدويًا.لذا ، إذا قام مستخدم فرنسي بتحديد وضع 12 ساعة يدويًا ، وطلب التطبيق NSDateFormatter من وقت الإخراج بتنسيق "HHMM" على مدار 24 ساعة ، فسيتلقى بالفعل وقتًا بتنسيق مدته 12 ساعة ، على سبيل المثال"01:00 مساءً"، كما لو أن التطبيق طلب بدلاً من ذلك "hhmm aa".سيحدث العكس إذا قام مستخدم أمريكي باختيار وضع 24 ساعة يدويًا:الوقت الإخراج مع تنسيق 12 ساعة "HHMM AA" سوف يجعلك بالفعل الوقت في تنسيق 24 ساعة بدلاً من ذلك ، على سبيل المثال"17:00".

يمكن العثور على مزيد من التفاصيل والحل البديل المحتمل في هذا مدونة.

يؤدي تعيين اللغة المحلية على منسق التاريخ إلى en_US إلى حل المشكلة بالنسبة لي:

    NSDateFormatter * f = [[NSDateFormatter alloc] init];
    [f setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
    f.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
    f.calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    f.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease];

لست متأكدًا مما إذا كانت إضافة التقويم مطلوبة أيضًا، ولكن هذا يعمل بشكل جيد.

أعتقد أن هذا هو الحل .

NSDateFormatter *df =[[NSDateFormatter alloc] init];
        [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
        NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];

[df setLocale: usLocale];

[usLocale release];

 NSDate *documento_en_Linea =[[[NSDate alloc] init]autorelease];

documento_en_Linea=[df dateFromString:@"2010-07-16 21:40:33"];

[df release];

        NSLog(@"fdocumentoenLineaUTC:%@!",documento_en_Linea);


//ouput  
     fdocumentoenLineaUTC:2010-07-16 09:40:33 p.m. -0500!

بالنسبة لأولئك الذين يجدون هذا السؤال ويريدون استخدام NSDateFormatter لتحليل الوقت على مدار 24 ساعة ويواجهون هذا الخطأ، فإن استخدام NSDateComponents لتحليل التواريخ والأوقات التي لها تنسيق معروف يتجنب هذه المشكلة:

NSString *dateStr = @"2010-07-05";
NSString *timeStr = @"13:30";

NSDateComponents *components = [[NSDateComponents alloc] init];
components.year = [[dateStr substringToIndex:4] intValue];
components.month = [[dateStr substringWithRange:NSMakeRange(5, 2)] intValue];
components.day = [[dateStr substringFromIndex:8] intValue];
components.hour = [[timeStr substringToIndex:2] intValue];
components.minute = [[timeStr substringFromIndex:3] intValue];

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDate *date = [calendar dateFromComponents:components];

[components release];
[calendar release];

يجب أن ينجح هذا أيضًا (على الرغم من أنني أرى بعض النتائج الغريبة).

-(NSString*)lowLevTime:(NSString*)stringFormat {
    char buffer[50];
    const char *format = [stringFormat UTF8String];
    time_t rawtime;
    struct tm * timeinfo;
    time(&rawtime);
    timeinfo = localtime(&rawtime);
    strftime(buffer, sizeof(buffer), format, timeinfo);
    return [NSString  stringWithCString:buffer encoding:NSASCIIStringEncoding];
}

اجابة قصيرة:يحاول [dateFormatter setDateFormat:@"yyyyMMddhhmmss"]; لتنسيق 12 ساعة (لاحظ الأحرف الصغيرة hh).

لقد كان موضوعًا محبطًا لأن العديد من مواقع الويب تشير إلى استخدامه HH لساعات (بما في ذلك وثائق Apple الرسمية)، ولكن هذا يضبطه على تنسيق 24 ساعة، بينما hh يستخدم تنسيق 12 ساعة.يرى http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns لمزيد من التفاصيل.

كمكافأة، لاحظ أنه يمكنك أيضًا استخدامها KK أو kk لتنسيق ساعة من اليوم، والذي من المحتمل أن يتم إيقافه بمقدار واحد.

تحديث:كنت أتطلع مؤخرًا إلى NSLocale (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSLocale_Class/Reference/Reference.html) ويبدو أنه يمكنك استخدام autoupdatingCurrentLocale لـ تطبيق التغييرات التي تم إجراؤها من داخل التطبيق على اللغة.والنتيجة هي أنه حتى إذا تم ضبط الهاتف لاستخدام نظام 24 ساعة (مثلما حدث عندما قمت بالتبديل إلى فرنسا)، فيمكنك إجراء تبديل 12/24 للتطبيق الذي لن يؤثر على أي تطبيقات أخرى على الهاتف. أو يطلب منك مغادرة التطبيق لإجراء التغيير.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top