سؤال

إذا استخدمت التعليمات البرمجية التالية:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];   
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm"];
NSDate *myDate = [dateFormatter dateFromString:@"2010-01-28T15:22:23.863"];
NSLog(@"%@", [dateFormatter stringFromDate:myDate]);

يتم تحويله بنجاح إلى Date كائن، ومع ذلك، لا أستطيع أن يبدو أنني تنسيقه بأي طريقة أخرى yyyy-MM-dd'T'HH:mm, ، أي ما الذي يتم تسجيله هو 2010-01-28T15:22:23

إذا قمت بتغيير DateFormat ليقول [dateFormatter setDateFormat:@"yyyy-MMMM-d'T'HH:mm"]; كائن التاريخ فارغ ...

لذلك سؤالك النهائي هو كيفية تهيئة الطابع الزمني ISO8601 من قاعدة بيانات SQL للاستخدام، على سبيل المثال، NSDateFormatterMediumStyle للعودة "1 يناير 2010"؟

هل كانت مفيدة؟

المحلول

تحتاج إلى تكيف آخر للتعامل مع الإخراج. ضع هذا بعد رمزك:

NSDateFormatter *anotherDateFormatter = [[NSDateFormatter alloc] init];   
[anotherDateFormatter setDateStyle:NSDateFormatterLongStyle];
[anotherDateFormatter setTimeStyle:NSDateFormatterShortStyle];
NSLog(@"%@", [anotherDateFormatter stringFromDate:myDate]);

نصائح أخرى

لدي مشكلة مماثلة ولكن أكثر تعقيدا قليلا، وقد وجدت حل بسيط للغاية!

المشكلة:تواريخ ISO8601 الواردة تبدو وكأنها هذه: 2006-06-14T11:06:00+02:00 لديهم تعويض الزمن في النهاية.

الحل:استخدام بيتر هوسي ISO8601DateFormatter. التي يمكنك تنزيلها من هنا.

ISO8601DateFormatter *formatter = [[ISO8601DateFormatter alloc] init];
NSDate *theDate = [formatter dateFromString:dateString];
[formatter release], formatter = nil;

و

ISO8601DateFormatter *formatter = [[ISO8601DateFormatter alloc] init];
NSString *dateString = [formatter stringFromDate:[twitch dateTwitched]];
[formatter release], formatter = nil;

هنا نموذج التعليمات البرمجية من Apple

    NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
    NSDate *date = [formatter dateFromString:dateString];

حلقة الوصل:https:/developer.apple.com/library/ios/#qa/qa1480/_index.html

فقط لذكر أنه نظرا لأن iOS 6.0 يمكنك استخدام هذا التنسيق:

 yyyy-MM-dd'T'HH:mm:ssZZZZZ

لدي تطبيق C سريع للغاية لتحليل ISO8601 NSStrings إلى NSDates في سام الفئات. وبعد يمكنك تثبيته مع Cocoapods أو مجرد نسخ الملفات إلى مشروعك.

إليك كيفية استخدامها:

[NSDate sam_dateFromISO8601String:@"2013-08-24T06:51:21-07:00"]

انها قوية جدا وتؤيد الزمن المفقودين، وما إلى ذلك تعليقي أعلاه قال، NSDateFormter كان بطيئا جدا بالنسبة لي عند تحليل الكثير من التواريخ. ساعد التبديل إلى هذا التنفيذ مبلغا هائلا.

يتم استخدام هذا الرمز في 6 تطبيقات الإنتاج (بما في ذلك المنهج و رون) لقد عملت مع أي مشاكل معروفة. هناك حزمة اختبار لمنع الانحدار.

باختصار، أعتقد أن هذه هي أفضل طريقة لتحليل سلاسل ISO8601 في الهدف - ج.


جانبا جانبا، إذا كنت مهتما بالأداء والنقل، وإرسال الأعداد الصحيحة بدلا من سلاسل ISO8601 مفضلة إلى حد كبير. يمكنك ببساطة تحويلها إلى تواريخ مع [NSDate dateWithTimeIntervalSince1970:yourInteger]. وبعد الأداء بأسرع ما يمكن تحقيقه وهناك أحرف أقل لنقلها عبر السلك.

يجب أن أشير إلى أن آخر مرة قمت بفحص التفاح NSDate الطرق لم تدعم ISO8601. لا يزال لدي خطأ مع Apple حول وضع الدعم الرسمي في.

+ (id)dateWithNaturalLanguageString:(NSString *)string

سوف بشكل صحيح (آخر مرة ركضها) تحليل وإنشاء NSDate كائن من سلسلة ISO801، على الرغم من أن الوثائق تقول إنك لا يجب عليك استخدامه، فقد عملت في جميع مواعيد ISO8601 التي جربتها حتى الآن.

إجابة danielbeard العمل بالنسبة لي. ومع ذلك، تحتاج إلى تضمين TIMEZONE وإلا فإنه يحول تاريخ UTC إلى Timezone الحالي الخاص بك الذي لا تريده.

- (NSDate *) dateFromISO8601DateString:(NSString *) dateString {
    NSDateFormatter * dateFormatter = [NSDateFormatter new];
    dateFormatter.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
    [dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
    NSDate * date = [dateFormatter dateFromString:dateString];
    return date;
}

Thread Captain جرب هذا التنسيق: "Yyyy-mm-dd't'hh: MM: SS.SSS"

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