¿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?

pupeno
fuente

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.

JamieH
fuente
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 .

Fuangwith S.
fuente
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


Dany Pop
fuente
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

Ivo Stoyanov
fuente
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));
tronman
fuente
¿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"));
neknek mouh
fuente
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"));
FireZenk
fuente
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());
Peter Mortensen
fuente
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;

}
Jorgesys
fuente
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
  • ...
Tomás
fuente
7

Utilice construir en clase de tiempo!

Time time = new Time();
time.set(0, 0, 17, 4, 5, 1999);
Log.i("DateTime", time.format("%d.%m.%Y %H:%M:%S"));
Igor Krumpak
fuente
Esta es la solución óptima porque utiliza el objeto Time ligero de Android Framework: developer.android.com/reference/android/text/format/Time.html
Dean Wild
13
Esta no es la solución óptima: no respeta el formato de fecha de la configuración regional del usuario.
Dan Hulme
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.

Ole VV
fuente
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();
Shahzad Afridi
fuente
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í .

Sunil
fuente
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;
}
chetan
fuente
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í .

Wojtek
fuente
4

Camino más corto:

// 2019-03-29 16:11
String.format("%1$tY-%<tm-%<td %<tR", Calendar.getInstance())

%tRes la abreviatura de %tH:%tM, <significa reutilizar el último parámetro ( 1$).

Es equivalente a String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM", Calendar.getInstance())

https://developer.android.com/reference/java/util/Formatter.html

k8C
fuente
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"));
Abhishek Singh Rathaur
fuente
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;
    }
}
ViliusK
fuente
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.
Albahaca Bourque
fuente
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());
alexpfx
fuente
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 :-)

Broo
fuente
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

subrahmanyam boyapati
fuente