yyyy simple patterns parse example ejemplo java date format locale

patterns - Java DateFormat/SimpleDateFormat con Locale(muestra solo el día en mes y mes)



simpledateformat patterns (3)

Cambia tu tercera última línea a

SimpleDateFormat sdfus = new SimpleDateFormat("MM/dd", Locale.US);

Superando la deficiencia de lo que ofrece Java estándar:

El método getDateInstance() toma un argumento para el style . El estilo más corto parece ser DateFormat.SHORT . Se puede argumentar que tal vez deberían proporcionar uno que sea aún más corto (¿ DateFormat.SHORTER quizás?) DateFormat.SHORTER

http://docs.oracle.com/javase/6/docs/api/java/text/DateFormat.html#getDateInstance(int)

Antes de que eso suceda, puedes construir una enumeración de patrones para el estilo más corto. A continuación hay un ejemplo:

import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; enum PatternShorter { // or PatternMonthDayOnly MM_SLASH_DD ("MM/dd") , DD_SLASH_MM ("dd/MM") ; private String pattern; public String getPattern() { return pattern; } private PatternShorter(String pattern) { this.pattern = pattern; } public static PatternShorter getDefault() { return DD_SLASH_MM; } } public class DateFormatEx { private static Map<Locale, PatternShorter> patternShorter = new HashMap<>(); static { patternShorter.put(Locale.UK, PatternShorter.DD_SLASH_MM); patternShorter.put(Locale.UK, PatternShorter.MM_SLASH_DD); // any locale not listed here will get the default pattern } private static String getPattern (Locale locale) { if (patternShorter.get(locale)!=null) { return patternShorter.get(locale).getPattern(); } else { return PatternShorter.getDefault().getPattern(); } } public static void main(String[] args) { List<Locale> listOfLocale = Arrays.asList(Locale.UK, Locale.US, Locale.FRENCH); for (Locale locale : listOfLocale) { SimpleDateFormat fmt = new SimpleDateFormat(getPattern(locale), locale); System.out.format("for locale %s the shorter date/month display is: %s%n" , locale.toString() , fmt.format(new Date())); } } }

La salida sería:

for locale en_GB the shorter date/month display is: 01/24 for locale en_US the shorter date/month display is: 24/01 for locale fr the shorter date/month display is: 24/01

Tengo una aplicación multicultural, el proyecto usa Java 7. Necesito mostrar la fecha, pero solo en el mes y el mes. Así que, por ejemplo, en Locale.UK la fecha de hoy parece: 24/01, pero en Locale.US como: 1/24. ¿Cómo lograr esto en Java 7? Traté de usar DateFormat.getDateInstance (dateFormat, locale), pero en este caso puedo usar formatos de fecha predefinidos, por ejemplo DateFormat.SHORT, DateFormat.DEFAULT, etc. No hay un formato predefinido solo con el día en mes y mes. Luego traté de usar SimpleDateFormat con la configuración regional, pero esto no está funcionando como me gustaría, simplemente traduce un texto de acuerdo con la configuración regional. Aquí está mi código de muestra:

DateFormat dfuk = DateFormat.getDateInstance(DateFormat.SHORT, Locale.UK); DateFormat dfus = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US); System.out.println(dfuk.format(new Date())); // 24/01/17 System.out.println(dfus.format(new Date())); // 1/24/17 SimpleDateFormat sdfuk = new SimpleDateFormat("dd/MM", Locale.UK); SimpleDateFormat sdfus = new SimpleDateFormat("dd/MM", Locale.US); System.out.println(sdfuk.format(new Date())); // 24/01 System.out.println(sdfus.format(new Date())); // 24/01

Esperaba que la última línea para imprimir 01/24 (o 1/24). ¿Cómo lograr esto?


Su código arrojaba el mismo formato porque ambos DateFormat se construyeron con el mismo patrón y eso no es correcto.

SimpleDateFormat sdfuk = new SimpleDateFormat("dd/MM", Locale.UK); SimpleDateFormat sdfus = new SimpleDateFormat("dd/MM", Locale.US);

Necesitará el local si tiene un String que se va a convertir a la fecha ... para el análisis que está tratando de hacer (string -> Date), solo el patrón está bien ...

Ejemplo

DateFormat sdfuk = new SimpleDateFormat("dd/MM"); DateFormat sdfus = new SimpleDateFormat("MM/d"); System.out.println(sdfuk.format(new Date())); // 24/01 System.out.println(sdfus.format(new Date())); // 01/24


tl; dr

MonthDay.from( LocalDate.now( ZoneId.of( "America/Montreal" ) ) ).format( DateTimeFormatter.ofPattern( "MM/dd" ) )

01/24

MonthDay

Hay una clase para eso: MonthDay .

MonthDay representa la combinación de un mes y un día del mes.

MonthDay md = MonthDay.of( Month.JANUARY , 24 );

Evite las clases heredadas de fecha y hora.

Evite las antiguas clases problemáticas de fecha y hora, como SimpleDateFormat , ahora heredado, suplantado por las clases java.time.

La clase MonthDay forma parte del framework java.time integrado en Java 8 y posterior. Gran parte de java.time se transfiere a Java 6 y Java 7 (ver a continuación).

ISO 8601

md.toString (): --01-24

El método toString genera una cadena en el formato estándar ISO 8601 . La clase MonthDay también puede analizar tales cadenas.

Fecha actual

Desea el mes-día de la fecha actual. Para la fecha actual usaremos la clase LocalDate . La clase LocalDate representa un valor de solo fecha sin hora del día y sin zona horaria.

Zona horaria

Un huso horario es crucial para determinar una fecha. Para cualquier momento dado, la fecha varía alrededor del mundo por zona. Por ejemplo, unos minutos después de la medianoche en París, Francia es un nuevo día cuando todavía está "ayer" en Montreal Québec .

Especifique un nombre de zona horaria adecuada en el formato continent/region , como America/Montreal , Africa/Casablanca o Pacific/Auckland . Nunca utilice la abreviatura de 3-4 letras, como EST o IST ya que no son zonas horarias verdaderas, no están estandarizadas y ni siquiera son únicas (!).

Tenga en claro que Locale no tiene nada que ver con las zonas horarias. Una Locale solo se aplica al formato de texto al generar cadenas, pero es separada y distinta de la zona horaria.

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

Ahora extrae un objeto MonthDay .

MonthDay md = MonthDay.from( today );

today.toString (): 2017-01-25

md.toString (): --01-25

Otros formatos

Puede generar cadenas en otros formatos.

Las clases java.time pueden localizar automáticamente algunos valores de fecha y hora por Locale . Lamentablemente, esto no se aplica a MonthDay . Para MonthDay debe especificar explícitamente el formato deseado en un objeto DateTimeFormatter cuando desee algo distinto al formato estándar ISO 8601. Por cierto, le recomiendo que se quede con el formato estándar siempre que sea posible , especialmente para intercambiar datos. Incluso podría considerar capacitar a sus usuarios para que acepten este formato. El formato estándar no es ambiguo, mientras que sus formatos de Reino Unido a EE. UU. (Dd / MM, MM / dd) pueden ser completamente ambiguos, como que 01/02 sea el 2 de enero o el 1 de febrero.

Locale para determinar (a) el idioma humano para la traducción del nombre del día, nombre del mes y demás, y (b) las normas culturales que deciden los problemas de abreviación, mayúsculas, puntuación, etc. En general, le aconsejo que siempre especifique una configuración Locale para DateTimeFormatter lugar de confiar implícitamente en la configuración Locale predeterminada actual de la JVM. Pero no veo ninguna forma en que la Locale afecte el resultado de este formato en particular. Así que omito la Locale en este ejemplo.

DateTimeFormatter fUS = DateTimeFormatter.ofPattern( "MM/dd" ); DateTimeFormatter fUK = DateTimeFormatter.ofPattern( "dd/MM" ); String output = md.format( fUS );

Código de Live

Vea este ejemplo de código ejecutado en vivo en IdeOne.com .

Acerca de java.time

El marco java.time está integrado en Java 8 y posterior. Estas clases suplantan a las problemáticas antiguas clases heredadas de fecha y hora, como java.util.Date , Calendar y SimpleDateFormat .

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

Para obtener más información, consulte el Tutorial de Oracle . Y busque para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .

¿Dónde obtener las clases de java.time?

  • Java SE 8 y SE 9 y posteriores
    • Incorporado.
    • Parte de la API Java estándar con una implementación integrada.
    • Java 9 agrega algunas características y correcciones menores.
  • Java SE 6 y SE 7
    • Gran parte de la funcionalidad de java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
  • Androide
    • El proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente) específicamente para Android.
    • Consulte Cómo utilizar ThreeTenABP ....

El proyecto ThreeTen-Extra amplía java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval , YearWeek , YearQuarter y más .