كيف أحصل على الوقت الحالي في منطقة زمنية مختلفة في جافا؟

StackOverflow https://stackoverflow.com/questions/1802758

سؤال

حسنًا - أشعر أنني غبي بطرح مثل هذا السؤال الأساسي ، ولكن مهلا.

أحاول الحصول على الوقت الحالي في منطقة زمنية مختلفة في Java Webapp. لقد جربت الحل الواضح التالي: في سيرتي ،

Calendar localCalendar = Calendar.getInstance(myBean.getTimeZone());

ثم أقوم بتمرير كائن التقويم إلى JSP كأمة طلب "LocalCalendar":

It is now: [${requestScope.localCalendar.time}]
in TimeZone ${requestScope.localCalendar.timeZone.ID}

لكن يبدو أن مخرجاتي يتجاهل مجموعة المنطقة الزمنية ، أي

It is now: [Thu Nov 26 10:01:03 GMT 2009] in TimeZone Indian/Mahe

أظن أن الأمر يتعلق بالإعدادات المحلية ، هل هناك أي طريقة لتنسيق الوقت لموقعتي ، في منطقة زمنية أخرى؟

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

المحلول

البيانات الداخلية ل Calendar هو في الأساس:

يمكن تمثيل لحظة في الوقت المناسب بقيمة مللي ثانية هي إزاحة من الحقبة ، 1 يناير 1970 00: 00: 00.000 بتوقيت جرينتش (غريغوريان).

لذلك ، يحمل ملف long سيكون ذلك هو نفسه بغض النظر عن العمليات التي تستخدمها عليها و toString لا يقدم أي وعود.

تريد تنسيق التاريخ وفقًا للمنطقة والمنطقة الزمنية. يمكنك القيام بذلك في طبقة العرض التقديمي (JSP) باستخدام أشياء مثل JSTL أو يمكنك تنسيق التاريخ في الفول باستخدام أ صيغة التاريخ وإرجاع القيمة كسلسلة.

نصائح أخرى

إذا كنت ترغب في عرض التاريخ بتنسيق/منطقة زمنية معينة ، فاستخدم SimpleDateFormat

ال الجواب من قبل ماكدويل صحيح ، لكن ال java.util.Calendarjava.util.Date) فصول تفوق.

Java.Time

تم تضمين إطار عمل Java.time في Java 8 ثم في وقت لاحق ، وتم نقله إلى Java 6 و 7 و Android. تحل هذه الفصول الجديدة محل فصول وقت التاريخ القديمة حيث أثبتت أنها سيئة التصميم ، مربكة ، ومزعجة.

و Instant هي اللحظة الحالية في UTC.

Instant now = Instant.now();

ضع منطقة زمنية ZoneId للحصول على ZonedDateTime.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

المنطقة الزمنية مقابل اللغة

لاحظ أن وحدة زمنية و Locale هي قضايا متعامدة. تؤثر المنطقة الزمنية على وقت ساعة الحائط, ، ال إزاحة من UTC. Locale يؤثر فقط على العرض التقديمي. يتم استخدام Locale لـ (أ) اللغة البشرية لاسم اليوم والشهر ، (ب) المعايير الثقافية المتعلقة بقضايا مثل شهر قبل يوم الشهر ، فاصلة مقابل الفترة ، وما إلى ذلك.

على سبيل المثال ، قد يكون لديك قراءة فرنسية Québécois المستخدم يصل إلى صفحتك أثناء العمل فيه الهند. لذا استخدم منطقة زمنية لـ Asia/Kolkata مع Locale.CANADA_FRENCH.

لإنشاء سلسلة منسقة استخدم DateTimeFormatter صف دراسي. العديد من الأمثلة موجودة بالفعل في سعة مكدس. حدد المطلوب/المتوقع Locale عبر withLocale طريقة.

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