الحصول على موعد خاطئ مع initWithTimeInterval: sincedate:
-
30-09-2019 - |
سؤال
عندي موعد، 2010-08-23 13:30:00 -0400
وأحاول الحصول عليها في المنطقة الزمنية للتوقيت العالمي +2. الفرق في الثواني هو 21600 ولكن عندما أتصل [[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate];
, ، انا حصلت 2010-08-24 01:30:00 +0200
التي يجب أن تكون 2010-08-23 19:30:00 +0200
. أي فكرة عما أفعله خطأ؟
المحلول
يمثل كائن التاريخ لحظة محددة في الوقت المناسب ، بغض النظر عن ما قد تقوله ساعات الأشخاص المختلفين في ذلك الوقت.
تتورط المناطق الزمنية عندما ترغب في عرض التاريخ ، حيث ستعرض عادة ما كانت ساعة المستخدم قد تقولها (أو تقول ، أو ستقول) في ذلك الوقت. هذا هو بالضبط ما يحدث عندما تكون NSLog
NSDATE: وصف التاريخ هو تلك اللحظة الزمنية الممثلة في منطقتك الزمنية المحلية.
إن إضافة أو طرح من NSDATE ليس تحويل المنطقة الزمنية. الإضافة والطرح تنتج NSDates تمثل آخر لحظات من زمن؛ في حالتك ، تقوم بإنشاء nsdate للحظة بعد 6 ساعات من اللحظة التي بدأت فيها ، ليس نفس اللحظة على الجانب الآخر من الكوكب.
للتبسيط ، ينظر تحويل المنطقة الزمنية نفس الوقت في نقاط مختلفة في الفضاء (أقسام مختلفة من سطح الكوكب) ، في حين أن إضافة التاريخ والطرح حساب أوقات مختلفة.
لا يوجد تحويل منطقة زمنية لـ NSDate ، لأنه ليس في منطقة زمنية لتبدأ. تتورط المنطقة الزمنية فقط عند تنسيق تاريخ تلك المنطقة الزمنية. لذلك ، لعرض هذا التاريخ في منطقة زمنية أخرى ، ما عليك سوى القيام بذلك. عادة ، هذا يعني توفير المنطقة الزمنية المطلوبة لك تاريخ تنسيق.
نصائح أخرى
أرى أن التاريخ الذي تعود إليه لديه منطقة زمنية مختلفة +200
ليس -400
. إذا لاحظت أنك سترى أن هذه النتيجة هي بالضبط 12 ساعة (أو 6 ساعات + 6 ساعات) بعد تاريخك الأصلي. هل قمت بالصدفة بتغيير اللغة أيضًا عندما قمت بالتاريخ الجديد؟ عندما قمت بالتغيير الذي بدأ يمنحك +200
بدلاً من -400
قام النظام تلقائيًا بتعديل الوقت للتعويض ، ثم أضفت 6 ساعات أخرى إلى التاريخ. يخزن NSDATE جميع التواريخ كفاصل زمني منذ 1 يناير 2001 بتوقيت جرينتش ويتم ضبطها في المناطق الزمنية حسب الحاجة.