سؤال

هذا السؤال لديه بالفعل إجابة هنا:

أحاول تحليل هذا التاريخ مع SimpleDateFormat وهو لا يعمل:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Formaterclass {
    public static void main(String[] args) throws ParseException{
        String strDate = "Thu Jun 18 20:56:02 EDT 2009";
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        Date dateStr = formatter.parse(strDate);
        String formattedDate = formatter.format(dateStr);
        System.out.println("yyyy-MM-dd date is ==>"+formattedDate);
        Date date1 = formatter.parse(formattedDate);

        formatter = new SimpleDateFormat("dd-MMM-yyyy");
        formattedDate = formatter.format(date1);
        System.out.println("dd-MMM-yyyy date is ==>"+formattedDate);
    }
}

إذا حاولت هذا الرمز مع strdate ="2008-10-14", ، لدي إجابة إيجابية. ما هي المشكلة؟ كيف يمكنني تحليل هذا التنسيق؟

ملاحظة. حصلت على هذا التاريخ من jDatePicker وليس هناك تعليمات حول كيفية تعديل تنسيق التاريخ الذي أحصل عليه عندما يختار المستخدم تاريخا.

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

المحلول

لا يمكنك توقع تحليل تاريخ مع SimpleDateFormat تم إعداده بتنسيق مختلف.

لتحليل "Thu Jun 18 20:56:02 EDT 2009" سلسلة التاريخ تحتاج إلى SimpleDateFormat مثل هذا (تقريبا):

SimpleDateFormat parser=new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy");

استخدم هذا لتحليل السلسلة في تاريخ، ثم تقوم SimpleDateFormat الأخرى بدوره إلى هذا التاريخ في التنسيق الذي تريده.

        String input = "Thu Jun 18 20:56:02 EDT 2009";
        SimpleDateFormat parser = new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy");
        Date date = parser.parse(input);
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        String formattedDate = formatter.format(date);

        ...

جافادوك: http://docs.oracle.com/javase/7/docs/api/java/text/simpledateformat.html

نصائح أخرى

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

Thu Jun 18 20:56:02 EDT 2009

ولكن تستخدم SimpleDateFormat إنه:

yyyy-MM-dd

الشكلان لا يوافقان. تحتاج إلى بناء SimpleDateFormat يطابق تخطيط السلسلة التي تحاول تحليلها في موعد. بطانة الأشياء تصل لجعل من السهل أن نرى، تريد SimpleDateFormat مثله:

EEE MMM dd HH:mm:ss zzz yyyy
Thu Jun 18 20:56:02 EDT 2009

تحقق من صفحة Javadoc التي ارتبطها ومعرفة كيفية استخدام الأحرف.

لدينا الآن طريقة أكثر حداثة للقيام بهذا العمل.

java.time.

ال java.time. يتم تجميع الإطار مع Java 8 والإصدارات الأحدث. يرى درس تعليمي. وبعد هذه الفصول الجديدة مستوحاة من جودا الوقت, ، محددة من قبل JSR 310., ، وموسعة من قبل threeten-extra مشروع. إنها تحسنة واسعة على الفصول القديمة المزعجة، java.util.date/.calendar et al.

لاحظ أن رموز الأحرف 3-4 مثل EDT ليست موحدة ولا فريدة من نوعها. تجنبها كلما أمكن ذلك. تعلم كيفية الاستخدام ISO 8601. التنسيقات القياسية بدلا من ذلك. قد يتخذ إطار Java.Time طعنة في ترجمة، لكن العديد من الرموز الشائعة الاستخدام لها قيم مكررة.

بالمناسبة، لاحظ كيف يولد Java.Time بشكل افتراضي سلاسل باستخدام تنسيقات ISO 8601 ولكن تمتد من خلال إلحاق اسم المنطقة الزمنية بين قوسين.

String input = "Thu Jun 18 20:56:02 EDT 2009";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "EEE MMM d HH:mm:ss zzz yyyy" , Locale.ENGLISH );
ZonedDateTime zdt = formatter.parse ( input , ZonedDateTime :: from );

تفريغ وحدة التحكم.

System.out.println ( "zdt : " + zdt );

عند تشغيل.

ZDT: 2009-06-18T20: 56: 02-04: 00 [America / New_york

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

للمتعة، دعنا نضغط إلى المنطقة الزمنية الهندية.

ZonedDateTime zdtKolkata = zdt.withZoneSameInstant ( ZoneId.of ( "Asia/Kolkata" ) );

Zdtkolkata: 2009-06-19T06: 26: 02 + 05: 30 [آسيا / كولكاتا

تحويل إلى القضاة

إذا كنت بحاجة فعلا إلى كائن Java.util.Date للاستخدام مع فئات لم يتم تحديثها بعد إلى أنواع Java.time، تحويل. لاحظ أنك تفقد المنطقة الزمنية المعينة، ولكن لديك نفس اللحظة التي تم ضبطها تلقائيا التوقيت العالمي.

java.util.Date date = java.util.Date.from( zdt.toInstant() );

ماذا عن getselecteddate.ب على أي حال، على وجه التحديد على سؤال التعليمات البرمجية، المشكلة مع هذا الخط:

new SimpleDateFormat("yyyy-MM-dd");

السلسلة التي تذهب في المنشئ يجب أن تتطابق مع تنسيق التاريخ. الوثائق لكيفية القيام بذلك هنا. وبعد يبدو أنك بحاجة إلى شيء قريب من "EEE MMM D HH: MM: SS Zzz Yyyy"

للإستجابة ل: "كيفية تحويل Tue سبتمبر 13 2016 00:00:00 بتوقيت جرينتش - 0500 (Hora de Verano Central (México)) إلى DD-MM-YY في Java؟"، تم وضع علامة على كيفية تكرار

جرب هذا: مع java.util.Date, java.text.SimpleDateFormat, إنه حل بسيط.

public static void main(String[] args) throws ParseException {

    String fecha = "Tue Sep 13 2016 00:00:00 GMT-0500 (Hora de verano central (México))";
    Date f = new Date(fecha);

    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    sdf.setTimeZone(TimeZone.getTimeZone("-5GMT"));
    fecha = sdf.format(f);
    System.out.println(fecha);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top