SimpleDateFormat formato eilutė ir lokalė

Bandau formuoti datą java skirtingai, remiantis šia vietove. Pavyzdžiui, noriu, kad anglų vartotojai matytų „2009 m. Lapkričio 1 d.“ (Suformatuotą „MMM d, yyyy“) ir norvegų naudotojus, kad pamatytų „2009 m. Lapkričio 1 d.“ („D. MMM. Yyyy“).

Mėnesio dalis veikia gerai, jei į „SimpleDateFormat“ konstruktorių įtraukiu kalbą, bet ką apie likusią?

Tikėjausi, kad kartu su „SimpleDateFormat“ galėsiu pridėti formato eilutes, bet aš negaliu rasti būdo tai padaryti. Ar įmanoma, ar man reikia kodo patikrinti lokalę ir pridėti atitinkamą formato eilutę?

67
02 нояб. rinkinys fiskeben 02 lapkritis 2009-11-02 16:25 '09, 16:25 2009-11-02 16:25
@ 9 atsakymai

Naudokite „ DateFormat.getDateInstance“ (int stilių, „Locale locale“), o ne sukurkite savo šablonus „ SimpleDateFormat .

74
02 нояб. atsakymą pateikė jarnbjo 02 lapkričio. 2009-11-02 16:38 '09, 16:38 PM 2009-11-02 16:38

 SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE dd MMM yyyy", Locale.ENGLISH); String formatted = dateFormat.format(the_date_you_want_here); 
69
31 янв. Atsakymas duotas redochka sausio 31 d. 2013-01-31 01:17 '13 - 1:17 2013-01-31 01:17

Naudokite stiliaus + kalbą : DateFormat.getDateInstance (int stilius, lokalė)

Peržiūrėkite http://java.sun.com/j2se/1.5.0/docs/api/java/text/DateFormat.html

Paleiskite šį pavyzdį, kad pamatytumėte skirtumus:

 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)); } } 

Išvada:

 United Kingdom: 25-Sep-2017 USA: Sep 25, 2017 France: 25 sept. 2017 Italy: 25-set-2017 Japan: 2017/09/25 
25
02 нояб. Atsakymą pateikė JuanZe 02 lapkričio. 2009-11-02 16:39 '09 at 4:39 2009-11-02 16:39

TL; dr

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

Dabar nenaudingos java.util.Date ir SimpleDateFormat klasės yra pasenusios, jas papildo java.time klasės.

LocalDate

LocalDate klasė reiškia datos vertę tik be laiko ir laiko juostos.

Laiko juosta yra labai svarbi nustatant datą. Bet kuriuo metu data keičiasi visame pasaulyje pagal zonas. Pavyzdžiui, po kelių minučių po vidurnakčio Paryžiuje Prancūzija yra nauja diena, vis dar „vakar“ Monrealio Kvebe .

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

DateTimeFormatter

Naudokite „ DateTimeFormatter norite generuoti eilutes, sudarančias tik dalį datos arba laikinos dalies.

DateTimeFormatter klasė gali būti automatiškai lokalizuota .

Jei norite lokalizuoti, nurodykite:

  • FormatStyle kad nustatytumėte, kiek ilgai arba sutrumpintai turėtų būti eilutė.
  • Locale skirta nustatyti (a) žmogaus kalbą, kad išverstumėte dienos pavadinimą, mėnesio pavadinimą ir kt. Ir b) kultūros normas, kuriomis sprendžiami sumažinimo, kapitalizacijos, skyrybos ir kt. Klausimai.

Pavyzdys:

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

Kreipdamiesi į kitą kryptį, galite išanalizuoti lokalizuotą eilutę.

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

Atkreipkite dėmesį, kad lokalė ir laiko juosta yra visiškai stačiakampės. Jūs galite turėti Monrealio akimirką, atstovaujamą japonų kalba, arba akimirką Oklande, Naujojoje Zelandijoje, atstovaujamą hindi kalba.

Kitas pavyzdys: 6 junio 2012 Pokytis (ispanų kalba) iki 2012-06-06 ( ISO 8601 standartinis formatas ). „Java“ laiko klasėse pagal standartą naudojami ISO 8601 formatai styginiams analizuoti.

 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. 

Atkūrimo formatai

Čia yra pavyzdinis kodas, rodantis kelių formatų kelių vietose rezultatus, automatiškai lokalizuotus.

EnumSet yra „ Set diegimas, labai optimizuotas naudoti tiek mažą atmintį, tiek greitą greitį renkant „ Enum objektus. Taigi, „ EnumSet.allOf( FormatStyle.class ) suteikia mums visų keturių „ FormatStyle . Norėdami gauti daugiau informacijos, žr. „ Oracle Tutorial“ apie skaičiavimo tipus .

 ------| 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 » 

Apie java.time

Java “ laiko rėmas yra pastatytas į „Java“ 8 ir vėlesnį. Šios klasės SimpleDateFormat nemalonias senas pasenusias laiko klases, pvz. Calendar SimpleDateFormat , Calendar ir SimpleDateFormat .

Joda-Time“ projektas, dabar veikiantis priežiūros režimu , pataria pereiti prie java.time klasių.

Jei norite sužinoti daugiau, patikrinkite „ Oracle Tutorial“ . Ir ieškokite ngn-wiki.ru daugelio pavyzdžių ir paaiškinimų. Specifikacija - JSR 310 .

Jūs galite keisti java.time objektus tiesiogiai su savo duomenų baze. Naudokite JDBC tvarkyklę, suderinamą su JDBC 4.2 ar naujesne versija. java.sql.* nereikia, java.sql.* .

Kur galiu gauti java.time klases?

ThreeTen-Extra“ projektas papildo java.time su papildomomis klasėmis. Šis projektas įrodo galimus būsimus java.time papildymus. Čia galite rasti naudingų klasių, tokių kaip Interval , YearWeek , YearQuarter ir kt .

9
01 дек. Atsakymą pateikė Basil Bourque 01 Dec. 2016-12-01 23:54 '16 at 11:54 pm 2016-12-01 23:54

Datos eilutės lokalizavimas:

Remiantis redsoniniu įrašu:

 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")); 

bus panašus į 05- 13 -2013

7
05 сент. atsakymas suteikiamas Yaro 05 sep . 2013-09-05 15:07 '13, 15:07 2013-09-05 15:07

Tai parodys datą pagal vartotojo dabartinę lokalę:

 import java.text.DateFormat; import java.util.Date; Date date = new Date(); DateFormat df = DateFormat.getDateTimeInstance(); String myDate = df.format(date); 

1969 m. Gruodžio 31 d. 19:00:02

 DateFormat.getDateInstance() 

1969 m. Gruodžio 31 d

1
13 марта '18 в 22:17 2018-03-13 22:17 atsakymas pateikiamas 40-Meilės kovo 13 d. 18 d. 10:17 val. 2018-03-13 22:17

„Java“ stilius nurodytai datai

 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))); 
0
26 окт. Atsakymą pateikė Mircea Stanciu spalio 26 d. 2017-10-26 07:17 '17 at 7:17 2017-10-26 07:17
 String text = new SimpleDateFormat("E, MMM d, yyyy").format(date); 
0
28 авг. Atsakymas pateikiamas Hadid Graphics 28 rug. 2017-08-28 09:57 '17 at 9:57 2017-08-28 09:57

„Java8“

  import java.time.format.DateTimeFormatter; myDate.format(DateTimeFormatter.ofPattern("dd-MMM-YYYY",new Locale("ar"))) 
-2
25 нояб. Abdennour TOUMI atsakymas lapkričio 25 d 2014-11-25 13:41 '14, 13:41 pm 2014-11-25 13:41

Peržiūrėkite kitus klausimus apie „ arba užduokite klausimą