Domanda

Sto cercando di formattare una data in Java in modi diversi in base alla locale specificata.Ad esempio, desidero che gli utenti inglesi vedano "1 novembre 2009" (formattato da "MMM d, aaaa") e gli utenti norvegesi vedano "1.nov.2009" ("d.MMM.aaaa").

La parte del mese funziona bene se aggiungo la localizzazione al costruttore SimpleDateFormat, ma per quanto riguarda il resto?

Speravo di poter aggiungere stringhe di formato abbinate alle impostazioni locali a SimpleDateFormat, ma non riesco a trovare alcun modo per farlo.È possibile o devo lasciare che il mio codice controlli la locale e aggiunga la stringa di formato corrispondente?

È stato utile?

Soluzione

Usa DateFormat.getDateInstance (int stile, locale locale) invece di creare i propri modelli con SimpleDateFormat.

Altri suggerimenti

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

Utilizzare la style + locale : DateFormat.getDateInstance (int stile, locale locale)

http: //java.sun .com / J2SE / 1.5.0 / docs / api / java / text / DateFormat.html

Esegui il seguente esempio per vedere le differenze:

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

Output:

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

tl; dr

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

Le classi fastidiosi java.util.Date e SimpleDateFormat sono ormai retaggio, soppiantato dalle classi java.time.

LocalDate

Il LocalDate classe rappresenta una data valore -solo senza tempo del giorno e senza fuso orario.

Un fuso orario è cruciale nel determinare una data. Per ogni dato momento, la data varia in tutto il mondo a seconda della zona. Per esempio, qualche minuto dopo la mezzanotte in Parigi Francia è un nuovo giorno, mentre ancora “di ieri ”in Montreal Québec .

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

DateTimeFormatter

DateTimeFormatter per generare stringhe che rappresentano solo la data porzione o il tempo-porzione.

Il DateTimeFormatter classe può automaticamente localizzare .

Per localizzare, specificare:

  • FormatStyle per determinare come lungo o abbreviato dovrebbe essere la stringa.
  • Locale per determinare (a) il linguaggio umano per la traduzione del nome del giorno, il nome del mese, e tale, e (b) le norme culturali che decidono questioni di abbreviazione, maiuscole, la punteggiatura, e così via.

Esempio:

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

Andando nella direzione opposta, è possibile analizzare una stringa localizzata.

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

Si noti che le impostazioni internazionali e il fuso orario sono completamente problemi ortogonali. Si può avere un momento Montréal presentati in lingua giapponese o un momento di Auckland Nuova Zelanda presentato in lingua hindi.

Un altro esempio: Change 6 junio 2012 (Spagnolo) per 2012-06-06 (rel="noreferrer"> ISO 8601 standard di

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. 

Si guardi con attenzione i formati

Ecco qualche esempio di codice per sfogliando i risultati di diversi formati in più locale, localizzati automaticamente.

EnumSet è un'implementazione del Set , altamente ottimizzato sia per basso utilizzo della memoria e velocità di esecuzione veloce durante la raccolta Enum oggetti. Quindi, EnumSet.allOf( FormatStyle.class ) ci dà una collezione di tutti e quattro la FormatStyle enum oggetti a loop. Per ulteriori informazioni, vedere Oracle Tutorial su tipi enum .

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

Output.

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

A proposito di java.time

Il java.time quadro è costruito in Java 8 e versioni successive. Queste classi soppiantare la vecchia eredità classi data-ora problematici, come java.util.Date , Calendar , e SimpleDateFormat .

Il Joda Time progetto , ora in modalità manutenzione , consigliati migrazione al classi java.time.

Per ulteriori informazioni, vedere la Oracle Esercitazione . E cercare Stack Overflow per molti esempi e spiegazioni. Le specifiche sono JSR 310 .

È possibile scambiare java.time oggetti direttamente con il database. Utilizzare un JDBC compatibile con JDBC 4.2 o successiva. Non c'è bisogno di corde, non c'è bisogno per le classi java.sql.*.

Dove ottenere le classi java.time?

Il href="http://www.threeten.org/threeten-extra/" rel="noreferrer"> ThreeTen-Extra java.time estende con classi aggiuntive. Questo progetto è un banco di prova per eventuali aggiunte future java.time. Si possono trovare alcune classi utili, come per esempio Interval , YearWeek , YearQuarter , e informazioni .

La localizzazione di stringa di data:

In base a post di 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"));

sarà come 05- 九月 -2013

Questo mostrerà la data in base alle locale dell'utente corrente :

Per la data e l'ora di ritorno:

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

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

31 Dicembre 1969 19:00:02

Per quella di ritorno solo, l'uso:

DateFormat.getDateInstance() 

31 dicembre 1969

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

Stile Java 8 per una determinata data

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")))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top