Pergunta

Eu estou tentando formatar uma data em Java de maneiras diferentes com base na localidade dada. Por exemplo, eu quero que os usuários inglês ver "01 de novembro de 2009" (formatado por "MMM d, aaaa") e os usuários noruegueses para ver "1. nov 2009" ( "d. MMM. Aaaa").

A parte mês funciona bem se eu adicionar a localidade para o construtor SimpleDateFormat, mas que sobre o resto?

Eu estava esperando que eu poderia acrescentar seqüências de formato emparelhado com locais para SimpleDateFormat, mas eu não consigo encontrar nenhuma maneira de fazer isso. É possível ou que eu preciso para deixar o meu código de verificar o local e adicionar a string de formato correspondente?

Foi útil?

Solução

Use DateFormat.getDateInstance (estilo int, locale locale) em vez de criar seus próprios padrões com SimpleDateFormat.

Outras dicas

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

Use o estilo + locale : DateFormat.getDateInstance (estilo int, Locale locale)

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

Execute o exemplo a seguir para ver as diferenças:

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

As classes problemáticas de java.util.Date e SimpleDateFormat estão agora legado, suplantado pelas classes java.time.

LocalDate

O LocalDate classe representa uma data valor -apenas sem hora do dia e sem fuso horário.

Um fuso horário é crucial para determinar uma data. Para qualquer dado momento, a data varia ao redor do globo por zona. Por exemplo, alguns minutos após a meia-noite em Paris França é um novo dia, enquanto ainda “ontem ”em Montréal Québec .

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

DateTimeFormatter

Use DateTimeFormatter para gerar strings representando apenas a data-parte ou o tempo-parte.

O DateTimeFormatter classe pode automaticamente Localize .

Para localizar, especificar:

  • FormatStyle para determinar como longa ou abreviada deve a string ser.
  • Locale para determinar (a) a linguagem humana para a tradução do nome do dia, nome do mês, e tal, e (b) as normas culturais decidir questões de abreviatura, capitalização, pontuação, e tal.

Exemplo:

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

Indo na outra direção, você pode analisar uma cadeia localizada.

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

Note que o local eo fuso horário são completamente questões ortogonais. Você pode ter um momento Montréal apresentado em língua japonesa ou um momento Auckland Nova Zelândia apresentados em língua hindi.

Outro exemplo: Mudança 6 junio 2012 (espanhol) para 2012-06-06 (standard formato ISO 8601 ). As classes java.time usar 8601 formatos ISO como padrão para analisar / geração de strings.

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. 

folhear formatos

Aqui está um exemplo de código para percorrer os resultados de múltiplos formatos em múltiplas localidades, localizados automaticamente.

Um EnumSet é uma implementação do Set , altamente otimizado tanto para baixo uso de memória e velocidade de execução rápida ao coletar Enum objetos. Então, EnumSet.allOf( FormatStyle.class ) nos dá uma coleção de todos os quatro do FormatStyle enum objetos para loop. Para mais informações, consulte a Oracle Tutorial em tipos 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() );

Saída.

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

Sobre java.time

O java.time framework é construído em Java 8 e posterior. Essas classes suplantar os velhos legado aulas de data e hora complicados, como java.util.Date , Calendar , & SimpleDateFormat .

O Joda-Time projeto , agora em modo de manutenção , aconselha migração para o java.time classes.

Para saber mais, consulte a A Oracle Tutorial . E busca Stack Overflow para muitos exemplos e explicações. Especificação é JSR 310 .

Você pode trocar java.time objetos diretamente com seu banco de dados. Use a driver JDBC compatível com JDBC 4.2 ou mais tarde. Não há necessidade de cordas, sem necessidade de aulas java.sql.*.

Onde obter as classes java.time?

O ThreeTen-Extra projeto estende java.time com aulas adicionais. Este projeto é um campo de provas para possíveis adições futuras para java.time. Você pode encontrar algumas classes úteis aqui, como Interval , YearWeek , YearQuarter , e mais .

Localização da cadeia de data:

Com base no post de 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"));

será como 05- ?? -2013

Isto irá exibir a data de acordo com a localidade corrente usuário :

Para a data e horário de retorno:

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

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

31 de dezembro de 1969 07:00:02

Até à data retornar apenas, use:

DateFormat.getDateInstance() 

31 de dezembro de 1969

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

Java 8 Estilo para uma determinada 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")))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top