وصف المشكلة وخطوات إعادة الإنتاج:
لنفترض أنني تلقيت تاريخًا من الخلفية بهذا التنسيق:
"2018-10-10T13:00:00+11:00"
ما أتوقع رؤيته في الواجهة الأمامية بعد التحليل والتنسيق:
10-10-2018 1.00 PM
ما حصلت عليه:
10-10-2018 5.00 AM
لا يهمني ما هي المنطقة الزمنية لنظامي. لا أريد أن أرى التوقيت العالمي المنسق أيضًا. كيف يمكنني تحقيقه؟
يرجى تضمين قيم جميع المتغيرات المستخدمة.
أنظر فوق.
بيئة:
لا يهم ، لا يجب أن تعتمد على البيئة. هذه هي المشكلة ، راجع للشغل ، لأنها تعتمد!
Afaik ، يتم تعيين اللحظة بشكل افتراضي لاستخدام المنطقة الزمنية للجهاز عند تنسيق التاريخ (وهو أيضًا السلوك القياسي لجافا سكريبت). لذا نعم ، يجب أن يعتمد تنسيق التاريخ على البيئة. على سبيل المثال ، أحصل على هذا على جهازي بتاريخك ، وهو الوقت الصحيح للتوقيت المحلي (أوكلاند):
moment("2018-10-10T13:00:00+11:00").format()
// => '2018-10-10T15:00:00+13:00'
إذا كنت تريد تعيين منطقة زمنية افتراضية للمستخدم يدويًا ، فيمكنك استخدام moment-timezone
مع اسم المنطقة الزمنية لـ IANA :
moment.tz.setDefault('America/New_York');
سيؤدي ذلك إلى فرض جميع التنسيقات التي يجب إجراؤها لتلك المنطقة الزمنية وتكون مستقلة عن البيئة.
هذا رابط للمستندات: https://momentjs.com/timezone/docs/#/using -timezones / default-timezone /
ليس من الممكن معرفة المنطقة الزمنية للمستخدم من الإزاحة (لأن العديد من المناطق الزمنية يمكن أن تشترك في نفس الإزاحة ، على سبيل المثال اعتمادًا على التوقيت الصيفي) ولكن يمكنك استخدام أسماء المنطقة Etc
للمناطق "العامة" ، على سبيل المثال Etc/GMT-11
في حالتك (العلامة مقلوبة لتلك المناطق). في حالتك ، قد يكون من المنطقي تخزين المنطقة الزمنية للمستخدم كإعداد واستمرارها على الخادم ، أو حفظها مع الطابع الزمني.
ثم يمكنك طباعة تاريخ واحد في منطقة زمنية معينة باستخدام على سبيل المثال
moment.tz("2018-10-10T13:00:00+11:00", "America/New_York");
شكرا simonhaenisch
لقد رأيت المكون الإضافي tz ، لكنني اعتقدت أنه يساعد في إدارة المناطق الزمنية ، مثل التحويل من واحدة إلى أخرى. ويبدو غريباً بالنسبة لي أن أستخدمها فقط لعدم لمس المنطقة الزمنية على الإطلاق :)
إذا كنت ترغب في تعيين منطقة زمنية افتراضية للمستخدم يدويًا
لسوء الحظ ، لا توجد منطقة زمنية default
في الخادم. لكل مستخدم المنطقة الزمنية الخاصة به ، المحفوظة في الملف الشخصي. والواجهة الأمامية لا تعرف شيئًا عنها.
لا يمكن معرفة المنطقة الزمنية للمستخدم منذ البداية
هذا جيد ، لا يهمني المنطقة الزمنية. كل ما أحتاجه هو الاحتفاظ بالموعد القادم دون تغييرات.
قم بتخزين المنطقة الزمنية للمستخدم كإعداد واستمر في ذلك على الخادم ، أو احفظها مع الطابع الزمني.
هذا ما يحدث بالضبط. المنطقة الزمنية عبارة عن إعداد والتاريخ المحفوظ به كطابع زمني.
نظرًا لأن واجهة برمجة التطبيقات الخلفية تحت سيطرتي ، يمكنني فقط إرسال نسخة مصغرة من التاريخ ، دون إزاحة المنطقة الزمنية. اتمني ان يكون مفيدا.
ولكن ، من المثير حقًا عدم وجود شيء من هذا القبيل في اللحظة. js:
moment(somDateTime).format({ formatWithDeviceTimezone: true })
أو نوع :)
حيث يكون formatWithDeviceTimezone
خطأ بشكل افتراضي.
على أي حال ، شكرًا ، الآن أرى المشكلة.
يمكنك تجربة parseZone
:
على سبيل المثال لمنطقة زمنية محلية في توقيت جرينتش (UTC + 1)
moment.parseZone("2018-10-10T13:00:00+11:00").format(); // "2018-10-10T13:00:00+11:00"
moment.parseZone("2018-10-10T13:00:00+11:00").local().format(); // "2018-10-10T03:00:00+01:00"
moment.parseZone("2018-10-10T13:00:00+11:00").utc().format(); // "2018-10-10T02:00:00Z"
التعليق الأكثر فائدة
يمكنك تجربة
parseZone
:على سبيل المثال لمنطقة زمنية محلية في توقيت جرينتش (UTC + 1)