SimpleDateFormat و LOKALE تستهلك سلسلة
-
12-09-2019 - |
سؤال
أحاول تهيئة تاريخ في 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؟
- جافا SE 8., جافا SE 9., ، و لاحقا
- مدمج.
- جزء من API Java القياسي مع تطبيق مجمع.
- Java 9 يضيف بعض الميزات البسيطة والإصلاحات.
- جاوة SE 6. و جافا SE 7.
- تم نقل الكثير من وظائف Java.time إلى Java 6 & 7 في Threeten Backport..
- ذكري المظهر
- إصدارات لاحقة من تطبيقات حزمة Android من فصول Java.Time.
- لالروبوت في وقت سابق، Threetenabp. مخصصات المشروع Threeten Backport. (المذكور أعلاه). يرى كيفية استخدام Threetenabp ....
ال 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")))