SimpleDateFormat y la cadena de formato basado en la configuración regional
-
12-09-2019 - |
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?
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 Aquí es un código de ejemplo para leer los resultados de múltiples formatos en múltiples localizaciones, localizadas automáticamente. Salida. El java.time marco está incorporado en Java 8 y versiones posteriores. Estas clases suplantan los legado clases de fecha y hora molestos, como 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 ¿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 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
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() );
------| 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
java.util.Date
, Calendar
, y SimpleDateFormat
. java.sql.*
.
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")))