كيف يمكنني عرض تاريخ مع TimeZone مخصص؟
-
19-09-2019 - |
سؤال
دعنا نقول أن لدي سلسلة تمثل تاريخا يشبه هذا:
"الأربعاء يوليو 08:08:48 بتوقيت جرينتش 2009"
لذلك أنا تحليل هذه السلسلة في كائن تاريخ مثل هذا:
DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss ZZZ yyyy");
Date fromDate = (Date)formatter.parse(fromDateString);
هذا يعطيني كائن التاريخ الصحيح. الآن أريد عرض هذا التاريخ كقيمة CDT.
لقد جربت أشياء كثيرة، وأنا فقط لا أستطيع الحصول عليها للعمل بشكل صحيح. يجب أن تكون هناك طريقة بسيطة باستخدام فئة DateFormat للحصول على هذا للعمل. اي نصيحه؟ كانت محاولتي الأخيرة:
formatter.setTimeZone(toTimeZone);
String result = formatter.format(fromDate);
المحلول
استخدم "zzz" بدلا من "zzz": "z" هو رمز لمنطقة زمنية RFC822.
DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
بعد القول أنه، نصيحة قياسية في التاريخ / الزمن الأشياء هي استخدام جودا الوقت, ، وهو API أفضل تماما.
تحرير: برنامج قصير ولكن كامل:
import java.text.*;
import java.util.*;
public class Test
{
public List<String> names;
public static void main(String [] args)
throws Exception // Just for simplicity!
{
String fromDateString = "Wed Jul 08 17:08:48 GMT 2009";
DateFormat formatter = new SimpleDateFormat
("EEE MMM dd HH:mm:ss zzz yyyy");
Date fromDate = (Date)formatter.parse(fromDateString);
TimeZone central = TimeZone.getTimeZone("America/Chicago");
formatter.setTimeZone(central);
System.out.println(formatter.format(fromDate));
}
}
الإخراج: الأربعاء يوليو 08 12:08:48 CDT 2009
نصائح أخرى
استخدام:
formatter.setTimeZone(TimeZone.getTimeZone("US/Central"));
المخرجات:
Wed Jul 08 12:08:48 CDT 2009
للتاريخ في مثالك على جهازي. وهذا هو بعد استبدال ZZZ ل ZZZ في سلسلة التنسيق.
آسف لحفر موضوع قديم. لكنني كنت أتساءل عما إذا كانت هناك فئة Java التي تحتوي على جميع معرفات المنطقة الزمنية كطبقة ثابتة. لذا بدلا من الاضطرار إلى التعداد الزمني معرف المنطقة الزمنية أثناء تحديد المنطقة الزمنية مثل هذا:
formatter.setTimeZone(TimeZone.getTimeZone("US/Central"));
سنفعل بدلا من ذلك شيئا أكثر معيارا / موحدا:
formatter.setTimeZone(TimeZone.getTimeZone(SomeConstantClass.US_CENTRAL));
حيث someconstantclass.java هي فئة تحمل الثوابت تشير إلى معرفات المنطقة الزمنية المختلفة التي تدعمها فئة TIMEZONE.
الطريقة الحديثة هي مع فصول java.time.
ZonedDateTime
حدد نمط تنسيق لمطابقة سلسلة الإدخال الخاصة بك. الرموز تشبه SimpleDateFormat
ولكن ليس بالضبط. تأكد من قراءة الفئة الوثيقة ل DateTimeFormatter
. وبعد لاحظ أننا نحدد Locale
لتحديد ما هي اللغة البشرية لاستخدامها لاسم يوم الأسبوع واسم الشهر.
String input = "Wed Jul 08 17:08:48 GMT 2009";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "EEE MMM dd HH:mm:ss z uuuu" , Locale.ENGLISH );
ZonedDateTime zdt = ZonedDateTime.parse ( input , f );
zdt.tostring (): 2009-07-08T17: 08: 48Z [GMT
يمكننا ضبط ذلك في أي منطقة زمنية أخرى.
حدد اسم المنطقة الزمنية المناسبة بتنسيق continent/region
. وبعد لا تستخدم أبدا اختصار الرسالة 3-4 مثل CDT
أو EST
أو IST
لأنها ليست مناطق زمنية حقيقية، وليس موحدة، ولا فريدة من نوعها (!).
سوف أخمن ذلك CDT
تقصد منطقة زمنية مثل America/Chicago
.
ZoneId z = ZoneId.of( "America/Chicago" );
ZonedDateTime zdtChicago = zdt.withZoneSameInstant( z );
zdtchicago.tostring () 2009-07-08T12: 08: 48-05: 00 [أمريكا / شيكاغو
Instant
عموما أفضل للعمل في UTC. لهذا استخراج Instant
. وبعد ال Instant
الصف يمثل لحظة في الجدول الزمني في التوقيت العالمي مع قرار nanoseconds. (حتى تسعة (9) أرقام من كسر عشري).
هذه Instant
فئة هي فئة بناء مباني من Java.Time. يمكن ان يخطر لك ZonedDateTime
كما Instant
بالإضافة إلى ZoneId
.
Instant instant = zdtChicago.toInstant();
instant.toststring (): 2009-07-08T17: 08: 48z
حول java.time.
ال java.time. تم تصميم الإطار في Java 8 والإصدارات الأحدث. هذه الفئات محلها القديم المزعج إرث فصول وقت التاريخ مثل java.util.Date
, .Calendar
, & java.text.SimpleDateFormat
.
ال جودا الوقت مشروع، الآن في نمط الصيانة, ، ينصح الهجرة إلى Java.Time.
لمعرفة المزيد، انظر أوراكل التعليمي. وبعد والبحث في تجاوز مكدس للعديد من الأمثلة والتفسيرات. المواصفات JSR 310..
أين تحصل على فصول java.time؟
- جافا SE 8. و SE 9. و لاحقا
- مدمج.
- جزء من API Java القياسي مع تطبيق مجمع.
- Java 9 يضيف بعض الميزات البسيطة والإصلاحات.
- جاوة SE 6. و SE 7.
- تم نقل الكثير من وظائف Java.time إلى Java 6 & 7 في Threeten Backport..
- ذكري المظهر
- ال Threetenabp. مخصصات المشروع Threeten Backport. (المذكورة أعلاه) لنظام أندرويد خصيصا.
- يرى كيف تستعمل….
ال threeten-extra مشروع يمتد java.time مع فئات إضافية. هذا المشروع هو أرض مثيرة للإضافات المستقبلية المحتملة إلى Java.Time. قد تجد بعض الفئات المفيدة هنا مثل Interval
, YearWeek
, YearQuarter
, ، و أكثر.