سؤال

أحاول تهيئة تاريخ في Java بطرق مختلفة بناء على اللغة المحددة. على سبيل المثال، أريد مستخدمو اللغة الإنجليزية أن يروا "1 نوفمبر 2009" (منسق من قبل "ط ط ط، يوي") للمستخدمين النرويجيين لرؤية "1. نوفمبر. 2009" ("D. MMM. YYYY").

يعمل جزء الشهر موافق إذا أضفت اللغة إلى منشئ SimpleDateFormat، ولكن ماذا عن البقية؟

كنت آمل أن أضيف سلاسل تنسيق مقترنة مع اللغيات إلى simpleedateformat، لكنني لا أستطيع إيجاد أي طريقة للقيام بذلك. هل من الممكن أو هل أحتاج إلى السماح لرمزي بفحص اللغة وإضافة سلسلة التنسيق المقابلة؟

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

المحلول

يستخدم Deadformat.getDateInstance (الأسلوب الدولي، لغة الإعدادات المحلية) بدلا من إنشاء أنماط الخاصة بك مع SimpleDateFormat.

نصائح أخرى

SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE dd MMM yyyy", Locale.ENGLISH);
String formatted = dateFormat.format(the_date_you_want_here);

استخدم ال نمط + لغة: Deadformat.getDateInstance (الأسلوب الدولي، لغة الإعدادات المحلية)

يفحص http://java.sun.com/j2se/1.5.0/docs/api/java/text/dateformat.html

قم بتشغيل المثال التالي لمعرفة الاختلافات:

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

public class DateFormatDemoSO {
  public static void main(String args[]) {
    int style = DateFormat.MEDIUM;
    //Also try with style = DateFormat.FULL and DateFormat.SHORT
    Date date = new Date();
    DateFormat df;
    df = DateFormat.getDateInstance(style, Locale.UK);
    System.out.println("United Kingdom: " + df.format(date));
    df = DateFormat.getDateInstance(style, Locale.US);
    System.out.println("USA: " + df.format(date));   
    df = DateFormat.getDateInstance(style, Locale.FRANCE);
    System.out.println("France: " + df.format(date));
    df = DateFormat.getDateInstance(style, Locale.ITALY);
    System.out.println("Italy: " + df.format(date));
    df = DateFormat.getDateInstance(style, Locale.JAPAN);
    System.out.println("Japan: " + df.format(date));
  }
}

انتاج:

United Kingdom: 25-Sep-2017
USA: Sep 25, 2017
France: 25 sept. 2017
Italy: 25-set-2017
Japan: 2017/09/25

TL؛ دكتور

LocalDate.now().format(
    DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM )
                     .withLocale( new Locale( "no" , "NO" ) )
)

الفصول المزعجة من java.util.Date و SimpleDateFormat هي الآن إرث، حلت من فصول Java.time.

LocalDate

ال LocalDate يمثل الفصل قيمة تاريخ فقط دون مرور الوقت ودون منطقة زمنية.

المنطقة الزمنية أمر حاسم في تحديد موعد. لأي لحظة معينة، يختلف التاريخ في جميع أنحاء العالم حسب المنطقة. على سبيل المثال، بعد دقائق قليلة من منتصف الليل باريس، فرنسا هو يوم جديد بينما لا يزال "أمس" مونتريال، كيبيك.

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

DateTimeFormatter

يستخدم DateTimeFormatter لتوليد السلاسل التي تمثل الجزء التاريخي أو الجزء الزمني.

ال DateTimeFormatter يمكن للفئة تلقائيا توضيح.

لتوطين، حدد:

  • FormatStyle لتحديد المدة التي يجب أن تكون السلسلة أو مختصرة.
  • Locale لتحديد (أ) اللغة البشرية لترجمة اسم اسم اليوم، واسم الشهر، وحتى (ب) المعايير الثقافية التي تقرر قضايا الاختصار والرسملة والعلامات الترقيم ومثلها.

مثال:

Locale l = Locale.CANADA_FRENCH ; 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( l );
String output = ld.format( f );

الذهاب الاتجاه الآخر، يمكنك تحليل سلسلة مترجمة.

LocalDate ld = LocalDate.parse( input , f );

لاحظ أن المنطقة المحلية والمنطقة الزمنية هي مشاكل متعامدة تماما. يمكنك الحصول على لحظة Montréal المقدمة باللغة اليابانية أو لحظة أوكلاند في نيوزيلندا المقدمة باللغة الهندية.

مثال آخر: التغيير 6 junio 2012 (الإسبانية) ل 2012-06-06 (اساسي ISO 8601. صيغة). تستخدم فصول Java.Time تنسيقات ISO 8601 بشكل افتراضي لتحليل / توليد السلاسل.

String input = "6 junio 2012";
Locale l = new Locale ( "es" , "ES" );
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "d MMMM uuuu" , l );
LocalDate ld = LocalDate.parse ( input , f );
String output = ld.toString();  // 2012-06-06. 

صيغ الرطوبة

فيما يلي بعض الأمثلة على إطلاع نتائج التنسيقات المتعددة في العديد من اللغيات، المترجمة تلقائيا.

أ EnumSet هو تنفيذ Set, ، محسن للغاية لكل من انخفاض استخدام الذاكرة وسرعة التنفيذ السريع عند جمع Enum أشياء. وبالتالي، EnumSet.allOf( FormatStyle.class ) يعطينا مجموعة من كل أربعة من FormatStyle يعين كائنات للحلقة. لمزيد من المعلومات، انظر أوراكل تعليمي على أنواع المعهد.

LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 );

List < Locale > locales = new ArrayList <>( 3 );
locales.add( Locale.CANADA_FRENCH );
locales.add( new Locale( "no" , "NO" ) );
locales.add( Locale.US );

// Or use all locales (almost 800 of them, for about 120K text results).
// Locale[] locales = Locale.getAvailableLocales(); // All known locales. Almost 800 of them.

for ( Locale locale : locales )
{
    System.out.println( "------|  LOCALE: " + locale + " — " + locale.getDisplayName() + "  |----------------------------------" + System.lineSeparator() );

    for ( FormatStyle style : EnumSet.allOf( FormatStyle.class ) )
    {
        DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( style ).withLocale( locale );
        String output = ld.format( f );
        System.out.println( output );
    }
    System.out.println( "" );
}
System.out.println( "« fin »" + System.lineSeparator() );

انتاج.

------|  LOCALE: fr_CA — French (Canada)  |----------------------------------

mardi 23 janvier 2018
23 janvier 2018
23 janv. 2018
18-01-23

------|  LOCALE: no_NO — Norwegian (Norway)  |----------------------------------

tirsdag 23. januar 2018
23. januar 2018
23. jan. 2018
23.01.2018

------|  LOCALE: en_US — English (United States)  |----------------------------------

Tuesday, January 23, 2018
January 23, 2018
Jan 23, 2018
1/23/18

« fin »

حول java.time.

ال java.time. تم تصميم الإطار في Java 8 والإصدارات الأحدث. هذه الفئات محلها القديم المزعج ميراث فصول وقت التاريخ مثل java.util.Date, Calendar, & SimpleDateFormat.

ال جودا الوقت مشروع، الآن في نمط الصيانة, ، ينصح الهجرة إلى java.time. الطبقات.

لمعرفة المزيد، انظر أوراكل التعليمي. وبعد والبحث في تجاوز مكدس للعديد من الأمثلة والتفسيرات. المواصفات JSR 310..

قد تبادل java.time. الكائنات مباشرة مع قاعدة البيانات الخاصة بك. إستخدم سائق JDBC متوافق مع JDBC 4.2. أو لاحقا. لا حاجة إلى سلاسل، لا حاجة ل java.sql.* الطبقات.

أين تحصل على فصول java.time؟

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

توطين سلسلة التاريخ:

بناء على مشاركة Redsonic:

private String localizeDate(String inputdate, Locale locale) { 

    Date date = new Date();
    SimpleDateFormat dateFormatCN = new SimpleDateFormat("dd-MMM-yyyy", locale);       
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy");


    try {
        date = dateFormat.parse(inputdate);
    } catch (ParseException e) {
        log.warn("Input date was not correct. Can not localize it.");
        return inputdate;
    }
    return dateFormatCN.format(date);
}

String localizedDate = localizeDate("05-Sep-2013", new Locale("zh","CN"));

سيكون مثل 05- 九月 -2013

سيعرض هذا التاريخ وفقا للمستخدم اللغة الحالية:

للعودة التاريخ والوقت:

import java.text.DateFormat;    
import java.util.Date;

Date date = new Date();
DateFormat df = DateFormat.getDateTimeInstance();
String myDate = df.format(date);

31 ديسمبر 1969 7:00:02 مساء

لتاريخ العودة فقط، استخدم:

DateFormat.getDateInstance() 

31 ديسمبر 1969

String text = new SimpleDateFormat("E, MMM d, yyyy").format(date);

Java 8 style لتاريخ معين

LocalDate today = LocalDate.of(1982, Month.AUGUST, 31);
System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.ENGLISH)));
System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.FRENCH)));
System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.JAPANESE)));

Java8.

 import java.time.format.DateTimeFormatter;         
 myDate.format(DateTimeFormatter.ofPattern("dd-MMM-YYYY",new Locale("ar")))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top