¿Cómo formatear fecha y hora en Android?


321

¿Cómo formatear correctamente según la fecha y hora de configuración del dispositivo cuando se tiene un año, mes, día, hora y minuto?

Respuestas:


291

Utilice la clase estándar Java DateFormat.

Por ejemplo, para mostrar la fecha y hora actuales, haga lo siguiente:

Date date = new Date(location.getTime());
DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());
mTimeText.setText("Time: " + dateFormat.format(date));

Puede inicializar un objeto Date con sus propios valores, sin embargo, debe tener en cuenta que los constructores han quedado en desuso y realmente debería estar usando un objeto Java Calendar.


42
Este es android.text.format.DateFormat en lugar de java.text.DateFormat.
jamesh

44
Es bastante típico de Android IME tener dos clases que afirman que le dan un resultado establecido en la configuración regional predeterminada, pero una no. Entonces, sí, no olvides usar la versión android.text.format de DateFormat (que ni siquiera deriva el java.util one LOL).
mxcl

22
Tenga en cuenta esta línea: DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());el formato de fecha devuelto es de tipo java.text.DateFormat(y NO android.text.format.DateFormat)
Arye Rosenstein

2
@Harsha: para solucionar ese problema, encamino mi uso de DateFormat, así que solo tengo que hacer referencia a la clase de Android y, por lo tanto, no hay clases ambiguas. Cadena final dateStr = DateFormat.getDateFormat (this) .format (d); Puede usar el método format () de Android y tener un código de limpieza (IMHO) y un objeto menos para instanciar.
Jerry Brady

23
Este formateador solo incluye la fecha, no la hora como se indicó en la pregunta original. Utilice DateUtils del mismo paquete en su lugar, consulte stackoverflow.com/questions/2983920/…
Asmo Soinio

203

En mi opinión, android.text.format.DateFormat.getDateFormat(context)me confunde porque este método devuelve en java.text.DateFormatlugar de android.text.format.DateFormat- - ".

Entonces, utilizo el código de fragmento como se muestra a continuación para obtener la fecha / hora actual en mi formato.

android.text.format.DateFormat df = new android.text.format.DateFormat();
df.format("yyyy-MM-dd hh:mm:ss a", new java.util.Date());

or

android.text.format.DateFormat.format("yyyy-MM-dd hh:mm:ss a", new java.util.Date());

Además, puede usar otros formatos. Sigue a DateFormat .


21
Útil, pero la pregunta decía "según la configuración del dispositivo". Para mí, eso implica utilizar un formato elegido en función del idioma / país del usuario, o elegido directamente por el usuario, en lugar de codificar la elección del formato.
Chris Boyle

17
Además, no olvide que hh:mm:ssle dará 01:00:00para la 1 PM, tendrá que usar kk:mm:sspara obtener13:00:00
dnet

2
@dnet kes la hora del día (1-24), no quiere decir H, que es la hora del día (0-23), por ejemplo. HH: mm: ss? Ver: developer.android.com/reference/java/text/SimpleDateFormat.html
Joony

1
@Joony no, hay una diferencia entre java.text.SimpleDateFormat(lo que vinculó y usa Hdurante horas en el rango de 0-23) y android.text.format.DateFormat(de qué trata la respuesta y lo que usa kdurante horas en el rango de
0-23

@dnet Después de la prueba, tiene razón acerca de k, sin embargo, la documentación de los DateFormatestados claros. Para la documentación canónica de las cadenas de formato, vea SimpleDateFormat. Muy confuso. ¿O me estoy perdiendo algo?
Joony

145

Puedes usar DateFormat. El resultado depende de la configuración regional predeterminada del teléfono, pero también puede especificar la configuración regional:

https://developer.android.com/reference/java/text/DateFormat.html

Esto es resultados en un

DateFormat.getDateInstance().format(date)                                          

FR Locale: 3 nov. 2017

US / En Locale: 12 de enero de 1952


DateFormat.getDateInstance(DateFormat.SHORT).format(date)

FR Local: 03/11/2017

US / En Locale: 12.13.52


DateFormat.getDateInstance(DateFormat.MEDIUM).format(date)

FR Locale: 3 nov. 2017

US / En Locale: 12 de enero de 1952


DateFormat.getDateInstance(DateFormat.LONG).format(date)

FR Local: 3 de noviembre de 2017

US / En Locale: 12 de enero de 1952


DateFormat.getDateInstance(DateFormat.FULL).format(date)

FR Locale: vendredi 3 de noviembre de 2017

US / En Locale: martes 12 de abril de 1952


DateFormat.getDateTimeInstance().format(date)

FR Locale: 3 nov. 2017 16:04:58


DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(date)

FR Local: 03/11/2017 16:04


DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM).format(date)

FR Local: 03/11/2017 16:04:58


DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG).format(date)

FR Local: 03/11/2017 16:04:58 GMT + 01: 00


DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.FULL).format(date)

FR Local: 03/11/2017 16:04:58 heure normale d'Europe centrale


DateFormat.getTimeInstance().format(date)

FR Locale: 16:04:58


DateFormat.getTimeInstance(DateFormat.SHORT).format(date)

FR Locale: 16:04


DateFormat.getTimeInstance(DateFormat.MEDIUM).format(date)

FR Locale: 16:04:58


DateFormat.getTimeInstance(DateFormat.LONG).format(date)

FR Local: 16:04:58 GMT + 01: 00


DateFormat.getTimeInstance(DateFormat.FULL).format(date)

FR Local: 16:04:58 heure normale d'Europe centrale



44
Gracias por poner todos estos casos en un solo lugar. Si también puede agregar casos por tiempo, esto lo convertirá en una referencia completa.
zeeshan

41

Fecha para localizar la cadena de fecha:

Date date = new Date();
String stringDate = DateFormat.getDateTimeInstance().format(date);

Opciones:

   DateFormat.getDateInstance() 

-> 31 de diciembre de 1969

   DateFormat.getDateTimeInstance() 

-> 31 de diciembre de 1969 4:00:00 p.m.

   DateFormat.getTimeInstance() 

-> 4:00:00 PM


3
¿Cómo eliminar el año de DateFormat.getDateInstance ()?
Hardik Joshi

21

Esto lo hará:

Date date = new Date();
java.text.DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());
mTimeText.setText("Time: " + dateFormat.format(date));

¿Se localizará esto cuando el usuario cambie el idioma en un dispositivo Android?
Kannan_SJD

14

Utilice SimpleDateFormat

Me gusta esto:

event.putExtra("starttime", "12/18/2012");

SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
Date date = format.parse(bundle.getString("starttime"));

55
Sí, con configuración regional predeterminada para evitar problemas de rendimiento:new SimpleDateFormat("my-format", Locale.getDefault());
iutinvg

14

Después de esto: http://developer.android.com/reference/android/text/format/Time.html

Es mejor usar la clase Time nativa de Android:

Time now = new Time();
now.setToNow();

Luego formatee:

Log.d("DEBUG", "Time "+now.format("%d.%m.%Y %H.%M.%S"));

1
@FireZenk: Según el [enlace] ( developer.android.com/reference/android/text/format/Time.html ) que proporcionó: esta clase tiene varios problemas y se recomienda utilizar GregorianCalendar en su lugar .
ccpizza

Oh ... esta información del problema es más reciente que mi comentario, así que esa es una respuesta obsoleta
FireZenk

10

Use estos dos como variables de clase:

 public java.text.DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
 private Calendar mDate = null;

Y úsalo así:

 mDate = Calendar.getInstance();
 mDate.set(year,months,day);                   
 dateFormat.format(mDate.getTime());

9

Este es mi método, puedes definir un formato de entrada y salida.

public static String formattedDateFromString(String inputFormat, String outputFormat, String inputDate){
    if(inputFormat.equals("")){ // if inputFormat = "", set a default input format.
        inputFormat = "yyyy-MM-dd hh:mm:ss";
    }
    if(outputFormat.equals("")){
        outputFormat = "EEEE d 'de' MMMM 'del' yyyy"; // if inputFormat = "", set a default output format.
    }
    Date parsed = null;
    String outputDate = "";

    SimpleDateFormat df_input = new SimpleDateFormat(inputFormat, java.util.Locale.getDefault());
    SimpleDateFormat df_output = new SimpleDateFormat(outputFormat, java.util.Locale.getDefault());

    // You can set a different Locale, This example set a locale of Country Mexico.
    //SimpleDateFormat df_input = new SimpleDateFormat(inputFormat, new Locale("es", "MX"));
    //SimpleDateFormat df_output = new SimpleDateFormat(outputFormat, new Locale("es", "MX"));

    try {
        parsed = df_input.parse(inputDate);
        outputDate = df_output.format(parsed);
    } catch (Exception e) { 
        Log.e("formattedDateFromString", "Exception in formateDateFromstring(): " + e.getMessage());
    }
    return outputDate;

}

8

SimpleDateFormat

Utilizo SimpleDateFormat sin un patrón personalizado para obtener la fecha y hora reales del sistema en el formato preseleccionado del dispositivo :

public static String getFormattedDate() {
    //SimpleDateFormat called without pattern
    return new SimpleDateFormat().format(Calendar.getInstance().getTime());
}

devuelve :

  • 13.01.15 11:45
  • 13/01/15 10:45 AM
  • ...


5

Las otras respuestas son generalmente correctas. Me gustaría contribuir con la respuesta moderna. Las clases Date, DateFormaty se SimpleDateFormatutilizan en la mayoría de las otras respuestas, están desactualizadas y han causado problemas a muchos programadores durante muchos años. Hoy tenemos mucho mejor en java.timeAKA JSR-310, la moderna API de fecha y hora de Java. ¿Puedes usar esto en Android todavía? ¡Seguramente! Las clases modernas se han trasportado a Android en el proyecto ThreeTenABP. Vea esta pregunta: Cómo usar ThreeTenABP en Android Project para todos los detalles.

Este fragmento debe ayudarlo a comenzar:

    int year = 2017, month = 9, day = 28, hour = 22, minute = 45;
    LocalDateTime dateTime = LocalDateTime.of(year, month, day, hour, minute);
    DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
    System.out.println(dateTime.format(formatter));

Cuando configuro el idioma preferido de mi computadora en inglés de EE. UU. O inglés de Reino Unido, esto imprime:

Sep 28, 2017 10:45:00 PM

Cuando, en cambio, lo configuro en danés, obtengo:

28-09-2017 22:45:00

Entonces sigue la configuración. Sin embargo, no estoy seguro de qué detalle sigue la configuración de fecha y hora de su dispositivo, y esto puede variar de un teléfono a otro.


5

¡Este código funciona para mí!

Date d = new Date();
    CharSequence s = android.text.format.DateFormat.format("MM-dd-yy hh-mm-ss",d.getTime());
    Toast.makeText(this,s.toString(),Toast.LENGTH_SHORT).show();

5

La clase de formato de fecha funciona con código de trucos para hacer la fecha Me gusta

  1. M -> 7, MM -> 07, MMM -> Julio, MMMM -> Julio
  2. EEE -> martes, EEEE -> martes
  3. z -> EST, zzz -> EST, zzzz -> Hora estándar del este

Puedes consultar más trucos aquí .


4

Este código devolvería la fecha y hora actuales:

public String getCurrDate()
{
    String dt;
    Date cal = Calendar.getInstance().getTime();
    dt = cal.toLocaleString();
    return dt;
}

1
toLocaleString () está en desuso
nspo

4

Lugar

Para obtener la fecha o la hora en formato local de milisegundos, utilicé esto:

Fecha y hora

Date date = new Date(milliseconds);
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT, Locale.getDefault());
dateFormat.format(date);

Fecha

Date date = new Date(milliseconds);
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.getDefault());
dateFormat.format(date);

Hora

Date date = new Date(milliseconds);
DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.getDefault());
dateFormat.format(date);

Puede usar otro estilo de fecha y estilo de hora. Más información sobre estilos aquí .



2

Tratar:

event.putExtra("startTime", "10/05/2012");

Y cuando accede a variables pasadas:

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
Date date = formatter.parse(bundle.getString("startTime"));

2

Lo uso así:

public class DateUtils {
    static DateUtils instance;
    private final DateFormat dateFormat;
    private final DateFormat timeFormat;

    private DateUtils() {
        dateFormat = android.text.format.DateFormat.getDateFormat(MainApplication.context);
        timeFormat = android.text.format.DateFormat.getTimeFormat(MainApplication.context);
    }

    public static DateUtils getInstance() {
        if (instance == null) {
            instance = new DateUtils();
        }
        return instance;
    }

    public synchronized static String formatDateTime(long timestamp) {
        long milliseconds = timestamp * 1000;
        Date dateTime = new Date(milliseconds);
        String date = getInstance().dateFormat.format(dateTime);
        String time = getInstance().timeFormat.format(dateTime);
        return date + " " + time;
    }
}

1

Evite el juDate

Java.util.Date y .Calendar y SimpleDateFormat en Java (y Android) son notoriamente problemáticos. Evítales. Son tan malos que Sun / Oracle los abandonó, reemplazándolos con el nuevo paquete java.time en Java 8 (no en Android a partir de 2014). El nuevo java.timefue inspirado por el Joda-Time biblioteca .

Joda-Time

Joda-Time funciona en Android.

Busque StackOverflow para "Joda" para encontrar muchos ejemplos y mucha discusión.

Un tidbit de código fuente usando Joda-Time 2.4.

Formato estandar.

String output = DateTime.now().toString(); 
// Current date-time in user's default time zone with a String representation formatted to the ISO 8601 standard.

Formato localizado

String output = DateTimeFormat.forStyle( "FF" ).print( DateTime.now() ); 
// Full (long) format localized for this user's language and culture.

1

En 2016, cuando quiero personalizar el formato (no de acuerdo con la configuración del dispositivo, como usted pregunta ...), generalmente uso el archivo de recursos de cadena:

en strings.xml:

<string name="myDateFormat"><xliff:g id="myDateFormat">%1$td/%1$tm/%1$tY</xliff:g></string>

En actividad:

Log.d(TAG, "my custom date format: "+getString(R.string.myDateFormat, new Date()));

Esto también es útil con el lanzamiento de la nueva Biblioteca de enlace de fechas .

Entonces puedo tener algo como esto en el archivo de diseño:

<TextView
    android:id="@+id/text_release_date"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:padding="2dp"
    android:text="@{@string/myDateFormat(vm.releaseDate)}"
    tools:text="0000"
    />

Y en clase java:

    MovieDetailViewModel vm = new MovieDetailViewModel();
    vm.setReleaseDate(new Date());

0

La clase Time de Android proporciona 3 métodos de formato http://developer.android.com/reference/android/text/format/Time.html

Así es como lo hice:

/**
* This method will format the data from the android Time class (eg. myTime.setToNow())   into the format
* Date: dd.mm.yy Time: hh.mm.ss
*/
private String formatTime(String time)
{
    String fullTime= "";
    String[] sa = new String[2];

    if(time.length()>1)
    {
        Time t = new Time(Time.getCurrentTimezone());
        t.parse(time);
        // or t.setToNow();
        String formattedTime = t.format("%d.%m.%Y %H.%M.%S");
        int x = 0;

        for(String s : formattedTime.split("\\s",2))
        {   
            System.out.println("Value = " + s);
            sa[x] = s;
            x++;
        }
        fullTime = "Date: " + sa[0] + " Time: " + sa[1];
    }
    else{
        fullTime = "No time data";
    }
    return fullTime;
}

Espero que sea útil :-)


0

Es muy tarde pero puede ayudar a alguien

DateFormat.format(format, timeInMillis);

aquí formatestá el formato que necesitas

Ej: "HH: mm" devuelve 15:30

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.