سؤال

دعنا نقول أن لدي سلسلة تمثل تاريخا يشبه هذا:

"الأربعاء يوليو 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؟

ال threeten-extra مشروع يمتد java.time مع فئات إضافية. هذا المشروع هو أرض مثيرة للإضافات المستقبلية المحتملة إلى Java.Time. قد تجد بعض الفئات المفيدة هنا مثل Interval, YearWeek, YearQuarter, ، و أكثر.

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