22

Actualmente estoy compilando mi primera aplicación para Android. Lo que estoy teniendo problemas es el almacenamiento y la visualización localizada de fechas en relación con un SimpleCursorAdapter. Tengo una clase que encapsula el acceso a un SQLitedatabase con tres tablas. Esta clase se encarga de almacenar todas las fechas en formato ISO ("aaaa-MM-dd"). Cuando los valores de fecha se leen desde la base de datos y se muestran en la pantalla, quiero que se formateen en un formato localizado. Este es el enfoque que se me ocurrió. Se utiliza un ViewBinder hacer el formato:Mostrando fechas en formato localizado en Android

adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() { 
    @Override 
    public boolean setViewValue(View view, Cursor cursor, 
      int columnIndex) { 
     if (view.getId() == R.id.text1) { 
      ((TextView) view).setText(getDateFormatView().format(
       parseDatabaseDate(cursor.getString(columnIndex)))); 
      return true; 
     } else if (view.getId() == R.id.text2) { 
      ((TextView)view).setText(
       cursor.getString(columnIndex)); 
      return true; 
     } else { 
      return false; 
     } 
    } 
}); 

getDateFormatView() crea un objeto SimpleDateFormat con un patrón que se lee desde strings.xml. parseDatabaseDate() realiza el análisis de la fecha desde la base de datos con un SimpleDateFormat que se construye utilizando un patrón constante yyyy-MM-dd.

Aunque este código funciona bien, me pregunto si existe una mejor manera de hacerlo. Lo que no me gusta es que necesito:

  • dos SimpleDateFormat objetos (se emplea en parseDatabaseDate() con el fin de analizar la cadena de la fecha de la SQLiteDatabase, el otro se utiliza para dar formato al valor)
  • una java.util.Date objeto que se crea y luego descarta inmediatamente
  • bastante (en mi opinión) código repetitivo.

Es por eso que estoy preguntando: ¿hay una mejor manera de mostrar las fechas en formato localizado?

Respuesta

43

Si desea omitir el análisis sintáctico, puede almacenar la fecha como larga. Entonces podría simplemente crear un nuevo objeto Date usando el análisis largo sin cero.

Esto no está directamente relacionado con su pregunta, pero: Una cosa que puede considerar utilizar es android.text.format.DateFormat para obtener los formateadores de fecha. De esta forma, formateará sus fechas/horas en la configuración regional del usuario en lugar de en sus propios ajustes preestablecidos. También puede hacer que su código sea más simple, ya que ya no necesita crear su propio SimpleDateFormat.

Con estas dos cosas en mente, usted puede deshacerse de las llamadas a sus propios métodos:

((TextView) view).setText(android.text.format.DateFormat.getDateFormat().format(new Date(cursor.getString(columnIndex)))); 
+0

Daniel, gracias por eso. Todavía tengo que familiarizarme con las clases de Google que reemplazan las clases Java comunes, como android.text.format.DateFormat. Usar longs para almacenamiento es una buena idea, también. Eso debería funcionar para esta aplicación específica que definitivamente no necesita almacenar fechas anteriores a 1970. –

+1

El código proporcionado por Daniel es teóricamente correcto, pero en su lugar tengo que hacer algunos ajustes para que sea esto: (vista (Vista de texto)) .setText (android.text.format.DateFormat.getDateFormat (Class.this) .format (new Date (cursor.getLong (columnIndex)))); – okysabeni