2010-09-24 16 views
25

¿Cómo se puede crear la representación de texto de una fecha, que toma en cuenta la configuración regional y que solo contiene día y mes (ningún año)?Formatear fecha sin año

siguiente código me da algo así como 23/09/2010

DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault()).format(date); 

quiero conseguir 23/09

+0

¿cómo está declarando la fecha? ¿Estás usando SimpleDateFormat? – Albinoswordfish

+0

Tengo un número de milisegundos desde época y quiero convertir esto a algo así como "23/09". – fhucho

+0

Ah, entonces desea que la fecha se formatee de acuerdo con el formato predeterminado para la configuración regional dada o predeterminada, pero con la porción del año eliminada. Entonces '23 de septiembre' se vería como '09/23' en una localidad, pero' 23/09' en otra. Me doy cuenta de que eso es esencialmente lo que dices en tu pregunta, pero creo que el ejemplo me desanimó. –

Respuesta

22

Puede usar expresiones regulares para recortar todos los y y cualquier carácter no alfabético antes y después, si Nueva York. Aquí hay un ejemplo de kickoff:

public static void main(String[] args) throws Exception { 
    for (Locale locale : Locale.getAvailableLocales()) { 
     DateFormat df = getShortDateInstanceWithoutYears(locale); 
     System.out.println(locale + ": " + df.format(new Date()));  
    } 
} 

public static DateFormat getShortDateInstanceWithoutYears(Locale locale) { 
    SimpleDateFormat sdf = (SimpleDateFormat) DateFormat.getDateInstance(DateFormat.SHORT, locale); 
    sdf.applyPattern(sdf.toPattern().replaceAll("[^\\p{Alpha}]*y+[^\\p{Alpha}]*", "")); 
    return sdf; 
} 

Verá que este fragmento lo prueba para todas las configuraciones regionales también. Parece que funciona bien para todas las configuraciones regionales aquí.

+1

O simplemente solicite 'SimpleDateFormat' para devolver lo que desea en primer lugar ... – Grodriguez

+4

@Gro: esto no es lo que el OP está pidiendo. Reemplace el método por 'return new SimpleDateFormat (" dd/MM ", locale);' y ejecútese usted mismo. Verá que la configuración regional solo se usa para representar día/mes en el idioma específico de la configuración regional (en mi caso, solo se aplica en tailandés). Intenta usar 'MMMM' en lugar de' MM' y verás que los nombres de los meses se traducen en consecuencia. No reordenará el patrón. – BalusC

+1

Tienes razón, lo siento. Yo malinterpreté la pregunta. Estoy borrando mi respuesta y estoy subiendo tu voto. – Grodriguez

3

lo hice de esta manera:

DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault()); 
if (dateFormat instanceof SimpleDateFormat) { 
    SimpleDateFormat simpleDateFormat = (SimpleDateFormat) dateFormat; 
    String pattern = simpleDateFormat.toPattern(); 

    // I modified the pattern here so that dd.MM.yyyy would result to dd.MM 

    simpleDateFormat.applyPattern(modifiedPattern); 

    ... etc 
} 
+0

Debería ser la respuesta – Mikhail

-1

o

SimpleDateFormat dateFormat = new SimpleDateFormat("EEE MMM d'); 
    dateFormat.format(date); 
+0

no una respuesta a esa pregunta – Zordid

5

Sólo quería contribuir otra modificación años de sacarlo del patrón, que funciona bien para DateFormat.MEDIUM, incluso en lugares tales como es_ES (d 'de' MMM 'de' yyyy) o lv_LV (y. 'gada' d. MMM).

public static DateFormat getMediumDateInstanceWithoutYears() 
{ 
    SimpleDateFormat sdf = (SimpleDateFormat) DateFormat.getDateInstance(DateFormat.MEDIUM); 
    sdf.applyPattern(sdf.toPattern().replaceAll(
     "([^\\p{Alpha}']|('[\\p{Alpha}]+'))*y+([^\\p{Alpha}']|('[\\p{Alpha}]+'))*", 
     "")); 
    return sdf; 
} 
+0

confirmo, funciona para pt, es, ru, uk, tr. –

2

La siguiente es una clase de utilidad que le da el formato de fecha sin año. Enumero todos los formatos de fecha conocidos por Java usando el siguiente código.

Locale[] locales = SimpleDateFormat.getAvailableLocales(); 
for (int i = 0; i < locales.length; i++) { 
    Locale locale = locales[i]; 
    DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL, locale); 
} 

Y a continuación, extraiga manualmente la pieza del año. Devuelve dos sabores de formato de fecha, normal y abreviado, es decir, lunes por, 18 de de marzo de vs Lun Mar 18

public class DateFormatWithoutYear { 

    private static Map<String, String> formats = new HashMap<String, String>(); 
    private static String DEFAULT_FORMAT = "EEEE, d MMMM"; 
    static { 
     formats.put("_af", "EEEE dd MMMM"); 
     formats.put("_am", "EEEE, d MMMM"); 
     formats.put("_az", "EEEE, d, MMMM"); 
     formats.put("_be", "EEEE, d MMMM"); 
     formats.put("_bg", "dd MMMM, EEEE"); 
     formats.put("BG_bg", "dd MMMM, EEEE"); 
     formats.put("_ca", "EEEE d MMMM"); 
     formats.put("ES_ca", "EEEE d MMMM"); 
     formats.put("_cs", "EEEE, d. MMMM"); 
     formats.put("CZ_cs", "EEEE, d. MMMM"); 
     formats.put("_da", "EEEE 'den' d. MMMM"); 
     formats.put("DK_da", "EEEE 'den' d. MMMM"); 
     formats.put("_de", "EEEE, d. MMMM"); 
     formats.put("AT_de", "EEEE, dd. MMMM"); 
     formats.put("BE_de", "EEEE, d. MMMM"); 
     formats.put("CH_de", "EEEE, d. MMMM"); 
     formats.put("DE_de", "EEEE, d. MMMM"); 
     formats.put("LI_de", "EEEE, d. MMMM"); 
     formats.put("LU_de", "EEEE, d. MMMM"); 
     formats.put("_el", "EEEE, d MMMM"); 
     formats.put("GR_el", "EEEE, d MMMM"); 
     formats.put("_en", "EEEE, MMMM d"); 
     formats.put("AU_en", "EEEE, d MMMM"); 
     formats.put("BE_en", "EEEE d MMMM"); 
     formats.put("BW_en", "EEEE dd MMMM"); 
     formats.put("BZ_en", "EEEE, MMMM d"); 
     formats.put("CA_en", "EEEE, d MMMM"); 
     formats.put("GB_en", "EEEE, d MMMM"); 
     formats.put("HK_en", "EEEE, d MMMM"); 
     formats.put("IE_en", "EEEE d MMMM"); 
     formats.put("IN_en", "EEEE d MMMM"); 
     formats.put("JM_en", "EEEE, MMMM d"); 
     formats.put("MH_en", "EEEE, MMMM d"); 
     formats.put("MT_en", "EEEE, d MMMM"); 
     formats.put("NA_en", "EEEE, MMMM d"); 
     formats.put("NZ_en", "EEEE, d MMMM"); 
     formats.put("PH_en", "EEEE, MMMM d"); 
     formats.put("PK_en", "EEEE, MMMM d"); 
     formats.put("RH_en", "EEEE dd MMMM"); 
     formats.put("SG_en", "EEEE, d MMMM"); 
     formats.put("TT_en", "EEEE, MMMM d"); 
     formats.put("US_en", "EEEE, MMMM d"); 
     formats.put("VI_en", "EEEE, MMMM d"); 
     formats.put("ZA_en", "EEEE dd MMMM"); 
     formats.put("ZW_en", "EEEE dd MMMM"); 
     formats.put("_es", "EEEE d 'de' MMMM"); 
     formats.put("AR_es", "EEEE d 'de' MMMM"); 
     formats.put("BO_es", "EEEE d 'de' MMMM"); 
     formats.put("CL_es", "EEEE d 'de' MMMM"); 
     formats.put("CO_es", "EEEE d 'de' MMMM"); 
     formats.put("CR_es", "EEEE d 'de' MMMM"); 
     formats.put("DO_es", "EEEE d 'de' MMMM"); 
     formats.put("EC_es", "EEEE d 'de' MMMM"); 
     formats.put("ES_es", "EEEE d 'de' MMMM"); 
     formats.put("GT_es", "EEEE d 'de' MMMM"); 
     formats.put("HN_es", "EEEE dd 'de' MMMM"); 
     formats.put("MX_es", "EEEE d 'de' MMMM"); 
     formats.put("NI_es", "EEEE d 'de' MMMM"); 
     formats.put("PA_es", "EEEE d 'de' MMMM"); 
     formats.put("PE_es", "EEEE d 'de' MMMM"); 
     formats.put("PR_es", "EEEE d 'de' MMMM"); 
     formats.put("PY_es", "EEEE d 'de' MMMM"); 
     formats.put("SV_es", "EEEE d 'de' MMMM"); 
     formats.put("US_es", "EEEE d 'de' MMMM"); 
     formats.put("UY_es", "EEEE d 'de' MMMM"); 
     formats.put("VE_es", "EEEE d 'de' MMMM"); 
     formats.put("_et", "EEEE, d. MMMM"); 
     formats.put("_eu", "EEEE, MMMM'ren' dd'a'"); 
     formats.put("_fi", "cccc, d. MMMM"); 
     formats.put("FI_fi", "cccc, d. MMMM"); 
     formats.put("_fil", "EEEE, MMMM dd"); 
     formats.put("PH_fil", "EEEE, MMMM dd"); 
     formats.put("_fr", "EEEE d MMMM"); 
     formats.put("BE_fr", "EEEE d MMMM"); 
     formats.put("CA_fr", "EEEE d MMMM"); 
     formats.put("CH_fr", "EEEE, d MMMM"); 
     formats.put("FR_fr", "EEEE d MMMM"); 
     formats.put("LU_fr", "EEEE d MMMM"); 
     formats.put("MC_fr", "EEEE d MMMM"); 
     formats.put("_gl", "EEEE dd MMMM"); 
     formats.put("_iw", "EEEE, d בMMMM"); 
     formats.put("IL_iw", "EEEE, d בMMMM"); 
     formats.put("_hi", "EEEE, d MMMM"); 
     formats.put("IN_hi", "EEEE, d MMMM"); 
     formats.put("_hr", "EEEE, d. MMMM"); 
     formats.put("HR_hr", "EEEE, d. MMMM"); 
     formats.put("_hu", "MMMM d., EEEE"); 
     formats.put("HU_hu", "MMMM d., EEEE"); 
     formats.put("_hy", "EEEE, MMMM d"); 
     formats.put("_in", "EEEE, dd MMMM"); 
     formats.put("ID_in", "EEEE, dd MMMM"); 
     formats.put("_it", "EEEE d MMMM"); 
     formats.put("CH_it", "EEEE, d MMMM"); 
     formats.put("IT_it", "EEEE d MMMM"); 
     formats.put("_ja", "M月d日EEEE"); 
     formats.put("JP_ja", "M月d日EEEE"); 
     formats.put("_ka", "EEEE, MMMM dd"); 
     formats.put("_kk", "EEEE, d MMMM"); 
     formats.put("_ko", "M월 d일 EEEE"); 
     formats.put("KR_ko", "M월 d일 EEEE"); 
     formats.put("_lt", "'m'. MMMM d 'd'., EEEE"); 
     formats.put("LT_lt", "'m'. MMMM d 'd'., EEEE"); 
     formats.put("_lv", "EEEE, d. MMMM"); 
     formats.put("LV_lv", "EEEE, d. MMMM"); 
     formats.put("_mk", "EEEE, dd MMMM"); 
     formats.put("_ms", "EEEE, d MMMM"); 
     formats.put("_nb", "EEEE d. MMMM"); 
     formats.put("NO_nb", "EEEE d. MMMM"); 
     formats.put("_nl", "EEEE d MMMM"); 
     formats.put("BE_nl", "EEEE d MMMM"); 
     formats.put("NL_nl", "EEEE d MMMM"); 
     formats.put("_pl", "EEEE, d MMMM"); 
     formats.put("PL_pl", "EEEE, d MMMM"); 
     formats.put("_ps", "EEEE د MMMM d"); 
     formats.put("_pt", "EEEE, d 'de' MMMM"); 
     formats.put("BR_pt", "EEEE, d 'de' MMMM"); 
     formats.put("PT_pt", "EEEE, d 'de' MMMM"); 
     formats.put("_rm", "EEEE, d. MMMM"); 
     formats.put("_ro", "EEEE, d MMMM"); 
     formats.put("RO_ro", "EEEE, d MMMM"); 
     formats.put("_ru", "EEEE, d MMMM"); 
     formats.put("RU_ru", "EEEE, d MMMM"); 
     formats.put("UA_ru", "EEEE, d MMMM"); 
     formats.put("_sk", "EEEE, d. MMMM"); 
     formats.put("SK_sk", "EEEE, d. MMMM"); 
     formats.put("_sl", "EEEE, dd. MMMM"); 
     formats.put("SI_sl", "EEEE, dd. MMMM"); 
     formats.put("_sr", "EEEE, dd. MMMM"); 
     formats.put("BA_sr", "EEEE, dd. MMMM"); 
     formats.put("CS_sr", "EEEE, dd. MMMM"); 
     formats.put("CYRL_sr", "EEEE, dd. MMMM"); 
     formats.put("CYRL_sr", "EEEE, dd. MMMM"); 
     formats.put("CYRL_sr", "EEEE, dd. MMMM"); 
     formats.put("CYRL_sr", "EEEE, dd. MMMM"); 
     formats.put("CYRL_sr", "EEEE, dd. MMMM"); 
     formats.put("CYRL_sr", "EEEE, dd. MMMM"); 
     formats.put("LATN_sr", "EEEE, dd. MMMM"); 
     formats.put("LATN_sr", "EEEE, dd. MMMM"); 
     formats.put("LATN_sr", "EEEE, dd. MMMM"); 
     formats.put("LATN_sr", "EEEE, dd. MMMM"); 
     formats.put("LATN_sr", "EEEE, dd. MMMM"); 
     formats.put("LATN_sr", "EEEE, dd. MMMM"); 
     formats.put("ME_sr", "EEEE, dd. MMMM"); 
     formats.put("RS_sr", "EEEE, dd. MMMM"); 
     formats.put("YU_sr", "EEEE, dd. MMMM"); 
     formats.put("_sv", "EEEE'en' 'den' d:'e' MMMM"); 
     formats.put("FI_sv", "EEEE'en' 'den' d:'e' MMMM"); 
     formats.put("SE_sv", "EEEE'en' 'den' d:'e' MMMM"); 
     formats.put("_sw", "EEEE, d MMMM"); 
     formats.put("_th", "EEEEที่ d MMMM G"); 
     formats.put("TH_th", "EEEEที่ d MMMM G"); 
     formats.put("_tr", "d MMMM EEEE"); 
     formats.put("TR_tr", "d MMMM EEEE"); 
     formats.put("_uk", "EEEE, d MMMM"); 
     formats.put("UA_uk", "EEEE, d MMMM"); 
     formats.put("_uz", "EEEE, MMMM dd"); 
     formats.put("_vi", "EEEE, 'ngày' dd MMMM"); 
     formats.put("VN_vi", "EEEE, 'ngày' dd MMMM"); 
     formats.put("_zh", "M月d日EEEE"); 
     formats.put("CN_zh", "M月d日EEEE"); 
     formats.put("HK_zh", "M月d日EEEE"); 
     formats.put("HANS_zh", "M月d日EEEE"); 
     formats.put("HANS_zh", "M月d日EEEE"); 
     formats.put("HANS_zh", "M月d日EEEE"); 
     formats.put("HANS_zh", "M月d日EEEE"); 
     formats.put("HANT_zh", "M月d日EEEE"); 
     formats.put("HANT_zh", "M月d日EEEE"); 
     formats.put("HANT_zh", "MM月dd日EEEE"); 
     formats.put("HANT_zh", "M月d日EEEE"); 
     formats.put("MO_zh", "MM月dd日EEEE"); 
     formats.put("SG_zh", "M月d日EEEE"); 
     formats.put("TW_zh", "M月d日EEEE"); 
     formats.put("_zu", "EEEE dd MMMM"); 
    } 

    public static String getLongFormatWithoutYear(Locale locale) { 
     if (locale != null) { 
      String key = locale.getCountry() + "_" + locale.getLanguage(); 
      String format = formats.get(key); 
      if (format != null) { 
       return format; 
      } 
     } 
     return DEFAULT_FORMAT; 
    } 

    public static String getShortFormatWithoutYear(Locale locale) { 
     String longFormat = getLongFormatWithoutYear(locale); 
     return longFormat.replaceAll("E+", "E").replaceAll("MMMM", "MMM"); 
    } 
} 
+1

Usted sabe que los métodos 'String.replaceAll' usan expresiones regulares para encontrar coincidencias Y trabajar en la cadena de reemplazo? Para "E +" está bien, pero cuando reemplazas MMMM con MMM, realmente quieres un "simple" 'String.replace (CharSequence, CharSequence)' ¡porque no usas ninguna expresión regular! – Zordid

+0

omg no necesita hacerlo, java/android ya tiene clases/utilidades necesarias para tales tareas ... – user924

40

Esto funcionará para Android , en caso de que alguien lo necesita:

int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_NO_YEAR; 
String monthAndDayText = DateUtils.formatDateTime(context, date, flags); 
+0

sin embargo la opción no_earar parece ser ignorada al menos en una reciente Sony d203 android 4.3 ..... Qué vergüenza – hotzen

+0

Desafortunadamente, este método usa las preferencias predeterminadas de formato de fecha y hora (orden y formato) y no obedece a la configuración del formato de fecha de Android. –

+0

Plus: ¿dónde está entrando la zona horaria? Un tiempo en millis nunca funcionará sin un huso horario. ¿Por qué siempre tengo la mala sensación de que incluso en Android, todas las cosas de fecha y hora están muy rotas? – Zordid

1
el uso de la biblioteca

com.ibm.icu:

import com.ibm.icu.text.DateFormat; 

DateFormat.getPatternInstance(DateFormat.MONTH_DAY, locale).format(date); 
1

Si utiliza Android, es posible que pueda utilizar getBestDateTimePattern, y sólo hay que poner allí todo el campos que desea permitir Debe colocar automáticamente el orden correcto y los caracteres especiales de acuerdo con la configuración regional actual.

Lamentablemente, requiere API 18+.

EDITAR: Esto parece una opción no tan buena, por desgracia. He escrito sobre él aquí: http://code.google.com/p/android/issues/detail?id=171591


lo tanto, esto es lo que he hecho:

public static String convertDateToString(Context context, Locale locale, final Date date, boolean alsoShowYearIfPossible) { 
    if (date == null) 
     return ""; 
    String defaultDateFormat; 
    if (locale != null) { 
     defaultDateFormat = ((SimpleDateFormat) DateFormat.getDateInstance(DateFormat.SHORT, locale)).toLocalizedPattern(); 
    } else defaultDateFormat = getDefaultDateFormat(context); 
    if (alsoShowYearIfPossible) 
     return new SimpleDateFormat(defaultDateFormat, Locale.getDefault()).format(date); 
    //need removal of year 
    String removedYearFormat = defaultDateFormat.replaceAll("[^{mdMD}]*y+[^{mdMD}]*", ""); 
    String result = new SimpleDateFormat(removedYearFormat, Locale.getDefault()).format(date); 
    //Log.d("AppLog", locale + ": \"" + defaultDateFormat + "\" => \"" + removedYearFormat + "\" =>" + result); 
    return result; 
} 

private static String getDefaultDateFormat(final Context context) { 
    String dateFormatString = Settings.System.getString(context.getContentResolver(), Settings.System.DATE_FORMAT); 
    if (TextUtils.isEmpty(dateFormatString)) { 
     // if device date format is available , use device date order,and if not available ,use default 
     final char[] dateFormatOrder = android.text.format.DateFormat.getDateFormatOrder(context); 
     if (dateFormatOrder.length == 0) 
      dateFormatString = DEFAULT_DATE_FORMAT; 
     else { 
      // construct the date format based on the device date order 
      final StringBuilder sb = new StringBuilder(); 
      for (int i = 0; i < dateFormatOrder.length; ++i) { 
       final char c = dateFormatOrder[i]; 
       switch (Character.toLowerCase(c)) { 
        case 'y': 
         sb.append("yyyy"); 
         break; 
        case 'm': 
         sb.append("MM"); 
         break; 
        case 'd': 
         sb.append("dd"); 
         break; 
       } 
       if (i != dateFormatOrder.length - 1) 
        sb.append('-'); 
      } 
      dateFormatString = sb.toString(); 
     } 
    } 
    return dateFormatString; 
} 

Este código funciona en cualquier localidad disponible, en Android 5.0.2.

Aquí es una muestra de cómo comprobarlo en lugares en:

Date date = new Date(); 
    for (Locale locale : Locale.getAvailableLocales()) { 
     SimpleDateFormat sdf = (SimpleDateFormat) DateFormat.getDateInstance(DateFormat.SHORT, locale); 
     String localizedDatePattern = sdf.toLocalizedPattern(); 
     convertDateToString(this,locale,date,false); 
    } 
2

La principal dificultad es que en algunos lugares el fin de mes y día es diferente. Lo resolví de una manera que difiere de las presentadas aquí y espero que funcione para todos los casos.

Date dateObject = ...; 

    String dayMonthDateString = getDayMonthDateString(dateObject, Locale.GERMANY); 
    Log.i("customDate", "dayMonthDateString = " + dayMonthDateString); 

private String getDayMonthDateString(Date date, Locale locale) 
{ 
    try 
    { 
     boolean dayBeforeMonth = defineDayMonthOrder(locale); 

     SimpleDateFormat newDateFormat; 

     if (dayBeforeMonth) 
     { 
      newDateFormat = new SimpleDateFormat("dd/MM", locale); 
     } 
     else 
     { 
      newDateFormat = new SimpleDateFormat("MM/dd", locale); 
     } 

     return newDateFormat.format(date); 
    } 
    catch (ParseException e) 
    { 
     e.printStackTrace(); 
    } 

    return null; 
} 


private boolean defineDayMonthOrder(Locale locale) throws ParseException 
{ 
    String day = "10"; 
    String month = "11"; 
    String year = "12"; 

    String calendarDate = day + "." + month + "." + year; 

    SimpleDateFormat format = new SimpleDateFormat("dd.MM.yy"); 
    Date date = format.parse(calendarDate); 

    String localizedDate = SimpleDateFormat.getDateInstance(SimpleDateFormat.SHORT, locale).format(date); 

    int indexOfDay = localizedDate.indexOf(day); 
    int indexOfMonth = localizedDate.indexOf(month); 

    return indexOfDay < indexOfMonth; 
} 
Cuestiones relacionadas