studio - simpledateformat java dd/mm/yyyy
android.text.format.DateFormat "HH" no se reconoce como con java.text.SimpleDateFormat (5)
Cuando uso el indicador "HH" en android.text.format.DateFormat
, se interpreta como un literal "HH". Pero cuando uso java.text.SimpleDateFormat
, se interpreta como la hora de 2 dígitos. ¿Por qué son diferentes?
No estoy buscando una alternativa de trabajo (ya sé que tengo que usar kk
lugar de HH
). Sólo tengo curiosidad por qué "HH" no es reconocido.
Ejemplo de java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Calendar calendar = Calendar.getInstance();
String dateJava = new java.text.SimpleDateFormat(
"dd-MM-yyyy HH:mm:ss").format(calendar.getTime());
String dateAndroid = android.text.format.DateFormat.format(
"dd-MM-yyyy HH:mm:ss", calendar).toString();
TextView tvAndroid = (TextView) findViewById(R.id.tvAndroid);
TextView tvJava = (TextView) findViewById(R.id.tvJava);
tvAndroid.setText("Android: " + dateAndroid); //prints 26-05-2013 HH:36:34
tvJava.setText("Java: " + dateJava); //prints 26-05-2013 22:36:34
}
La salida es:
Android: 26-05-2013 HH:36:34
Java: 26-05-2013 22:36:34
Espero que ambos sean 26-05-2013 22:36:34
¿Tiene el DateFormat de Android un error?
SimpleDateFormat de Java acepta estos:
H Hour in day (0-23) Number 0
k Hour in day (1-24) Number 24
K Hour in am/pm (0-11) Number 0
h Hour in am/pm (1-12) Number 12
Así que parece que los desarrolladores de Android decidieron cambiar el significado de k
y en su función DateFormat es equivalente a SimpleDateFormat H
como dicen explícitamente en su página de documentación :
This constant was deprecated in API level 18. Use a literal ''H'' (for
compatibility with SimpleDateFormat and Unicode) or ''k'' (for compatibility
with Android releases up to and including Jelly Bean MR-1) instead. Note
that the two are incompatible.
¿Cuál es la razón para esto?
¿Porque ... no es lo mismo y se comporta como indica la documentación?
De la Documentación para android.text.format.DateFormat
Esta clase solo admite un subconjunto de la especificación completa de Unicode. Utilice SimpleDateFormat si necesita más.
Pero si sigues leyendo los documentos :
public static final char HOUR_OF_DAY
Este designador indica la hora del día en formato de 24 horas. Ejemplo para 3pm: k -> 15 Ejemplos para medianoche: k -> 0 kk -> 00
Entonces ... usando esa clase, sería kk
lugar de HH
Entiendo que ya ha aceptado una respuesta, pero solo para explicarle esto completamente ...
Desde el código fuente de DateFormat.java ...
Los métodos de
format
en esta clase implementan un subconjunto de patrones Unicode UTS # 35 . El subconjunto actualmente compatible con esta clase incluye los siguientes caracteres de formato:acdEHhLKkLMmsyz
. Hasta el nivel de API 17, solo seadEhkMmszy
. Tenga en cuenta que esta clase implementa incorrectamentek
como si fueraH
por compatibilidad con versiones anteriores.
Tenga en cuenta la parte que he marcado en negrita.
La fuente a la que me vinculé se ha actualizado para permitir el uso de H, pero aún no está en la versión general (API 17 es la versión actual de Android y no es compatible con H).
Más adelante en la fuente, en la etapa de declarar las constantes de caracteres de formato, hay este comentario ...
/**
* @deprecated Use a literal {@code ''H''} (for compatibility with {@link SimpleDateFormat}
* and Unicode) or {@code ''k''} (for compatibility with Android releases up to and including
* Jelly Bean MR-1) instead. Note that the two are incompatible.
*/
@Deprecated
public static final char HOUR_OF_DAY = ''k'';
... y más tarde durante el reemplazo de personaje ...
case ''H'': // hour in day (0-23)
case ''k'': // hour in day (1-24) [but see note below]
{
int hour = inDate.get(Calendar.HOUR_OF_DAY);
// Historically on Android ''k'' was interpreted as ''H'', which wasn''t
// implemented, so pretty much all callers that want to format 24-hour
// times are abusing ''k''. http://b/8359981.
if (false && c == ''k'' && hour == 0) {
hour = 24;
}
replacement = zeroPad(hour, count);
}
break;
Esto funciona para todos los Android 4.0+ y para el formato de dos fechas.
Utilice java.text.SimpleDateFormat.
Ejemplo de trabajo:
El formato de 24 horas usa este patrón de fecha = " dd-MM-aaaa HH: mm ";
El formato de 12 horas usa este patrón de fecha = " dd-MM-aaaa hh: mm a ";
public static String getDateAsString(Date date, String pattern) {
Locale locale = new Locale("EN");
SimpleDateFormat sdf = null;
try {
sdf = new SimpleDateFormat(pattern, locale);
return sdf.format(date);
} catch (IllegalArgumentException ex) {
// default format
sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm", locale);
return sdf.format(date);
}
}
Nunca he programado para Android. Busqué en Google el DateFormat javadoc y vi allí los siguientes ejemplos:
Examples for April 6, 1970 at 3:23am:
"MM/dd/yy h:mmaa" -> "04/06/70 3:23am"
"MMM dd, yyyy h:mmaa" -> "Apr 6, 1970 3:23am"
"MMMM dd, yyyy h:mmaa" -> "April 6, 1970 3:23am"
"E, MMMM dd, yyyy h:mmaa" -> "Mon, April 6, 1970 3:23am&
"EEEE, MMMM dd, yyyy h:mmaa" -> "Monday, April 6, 1970 3:23am"
"''Noteworthy day: ''M/d/yy" -> "Noteworthy day: 4/6/70"
La "hora" se marca con la letra minúscula h
en lugar de SimpleDateFormat
donde se usa la letra mayúscula para este propósito.
Para android.text.format.DateFormat, designa Hora en día como kk
esta manera:
String dateAndroid = android.text.format.DateFormat.format(
"dd-MM-yyyy kk:mm:ss", calendar).toString();
Para java.text.SimpleDateFormat, designa hora en día como HH
.
H hora en día (0-23)
Documentación para android.text.format.DateFormat:
public static final char HOUR_OF_DAY
Este designador indica la hora del día en formato de 24 horas. Ejemplo para 3pm: k -> 15 Ejemplos para medianoche: k -> 0 kk -> 00