Pregunta

Estoy tratando de dar formato a una fecha en Java de diferentes maneras en función de la localidad dada. Por ejemplo, yo quiero ver a los usuarios inglés "1 Nov, 2009" (con formato de "MMM d, aaaa") y los usuarios de Noruega a ver "1. Nov. 2009" ( "d. MMM. Aaaa").

La parte correspondiente al mes funciona bien si agrego la configuración regional al constructor SimpleDateFormat, pero ¿qué pasa con el resto?

Tenía la esperanza de que podría añadir cadenas de formato emparejado con lugares a SimpleDateFormat, pero no puedo encontrar ninguna manera de hacer esto. ¿Es posible o tengo que dejar que mi cheque de código de la configuración regional y añadir la cadena de formato correspondiente?

¿Fue útil?

Solución

Uso DateFormat.getDateInstance (int estilo, locale locale) en lugar de crear sus propios patrones con SimpleDateFormat.

Otros consejos

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

Utilice la + estilo local : (int estilo, Locale locale) DateFormat.getDateInstance

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

Ejecutar el siguiente ejemplo para ver las diferencias:

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

Salida:

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

Las clases molestos de java.util.Date y SimpleDateFormat son ahora legado, suplantado por las clases java.time.

LocalDate

El LocalDate clase representa una fecha valor -sólo sin tiempo de día y sin zona horaria.

Una zona horaria es crucial en la determinación de una fecha. Por un momento dado, la fecha varía en todo el mundo por zona. Por ejemplo, unos minutos después de la medianoche en París Francia es un nuevo día, mientras que todavía “ayer ”en Montréal Québec .

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

DateTimeFormatter

Uso DateTimeFormatter para generar cadenas que representan solamente la porción de fecha o la porción de tiempo.

El DateTimeFormatter clase puede automáticamente localizar .

Para localizar, especifique:

  • FormatStyle para determinar cómo de largo o abreviado debe ser la cadena.
  • Locale para determinar (a) el lenguaje humano para la traducción del nombre del día, el nombre del mes, y tal, y (b) las normas culturales que deciden cuestiones de abreviatura, uso de mayúsculas, puntuacion, y tal.

Ejemplo:

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

En la otra dirección, se puede analizar una cadena localizada.

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

Tenga en cuenta que la configuración regional y la zona horaria son completamente ortogonales cuestiones. Puede tener un momento de Montreal presentada en idioma japonés o un momento en Auckland Nueva Zelanda presentada en idioma hindi.

Otro ejemplo: Cambio 6 junio 2012 (español) para 2012-06-06 (rel="noreferrer"> formato ISO 8601 estándar

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. 

Examine formatos

Aquí es un código de ejemplo para leer los resultados de múltiples formatos en múltiples localizaciones, localizadas automáticamente.

EnumSet es una implementación de Set , altamente optimizado tanto para el uso de memoria baja y la rápida velocidad de ejecución en la recogida de Enum objetos. Así, EnumSet.allOf( FormatStyle.class ) nos da una colección de los cuatro de la FormatStyle enumeración objetos a bucle. Para obtener más información, consulte Oracle Tutorial sobre los tipos de enumeración .

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

Salida.

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

Acerca de java.time

El java.time marco está incorporado en Java 8 y versiones posteriores. Estas clases suplantan los legado clases de fecha y hora molestos, como java.util.Date , Calendar , y SimpleDateFormat .

El Joda-Time proyecto, ahora en el modo de mantenimiento , aconseja migración a la clases java.time.

Para obtener más información, consulte la Oracle Tutorial . Y la búsqueda de desbordamiento de pila durante muchos ejemplos y explicaciones. Especificación es JSR 310 .

Es posible intercambiar java.time objetos directamente con su base de datos. Use un href="https://en.wikipedia.org/wiki/JDBC_driver" rel="noreferrer"> JDBC conductor compatible con JDBC 4.2 o posterior. No hay necesidad de cadenas, sin necesidad de clases java.sql.*.

¿Dónde obtener las clases java.time?

El ThreeTen-Extra Proyecto java.time se extiende con clases adicionales. Este proyecto es un campo de pruebas para posibles futuras adiciones a java.time. Usted puede encontrar algunas clases útiles aquí, como Interval , YearWeek , YearQuarter , y más .

La localización de cadena de fecha:

Basado en el 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

Esto mostrará la fecha en función de localización actual del usuario

Para volver fecha y hora:

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

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

31 de Dic, 1969 7:00:02 PM

Para devolver la fecha solamente, utilice:

DateFormat.getDateInstance() 

31 de diciembre 1969

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

Java 8 estilo para una fecha dada

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top