studio - Obtén la hora y fecha actual en Android




obtener la fecha actual en java android (20)

¿Cómo puedo obtener la hora y fecha actuales en una aplicación de Android?


tl; dr

Instant.now()  // Current moment in UTC.

…o…

ZonedDateTime.now( ZoneId.of( "America/Montreal" ) )  // In a particular time zone

Detalles

Las otras respuestas, aunque correctas, están desactualizadas. Las antiguas clases de fecha y hora han demostrado ser mal diseñadas, confusas y problemáticas.

java.time

Esas clases antiguas han sido suplantadas por el marco java.time .

Estas nuevas clases están inspiradas en el exitoso proyecto Joda-Time , definido por JSR 310 , y extendido por el proyecto ThreeTen-Extra .

Ver el Tutorial de Oracle .

Instant

Un Instant es un momento en la línea de tiempo en UTC con resolución de hasta nanoseconds .

 Instant instant = Instant.now(); // Current moment in UTC.

Zona horaria

Aplique una zona horaria ( ZoneId ) para obtener un ZonedDateTime . Si omite la zona horaria, la zona horaria predeterminada actual de su JVM se aplica implícitamente. Es mejor especificar explícitamente la zona horaria deseada / esperada.

Use nombres de zonas horarias adecuadas en el formato de continent/region como America/Montreal , Europe/Brussels o Asia/Kolkata . Nunca use las abreviaturas de 3 a 4 letras, como EST o IST ya que no están estandarizadas ni son únicas.

ZoneId zoneId = ZoneId.of( "America/Montreal" ); // Or "Asia/Kolkata", "Europe/Paris", and so on.
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

Generando cuerdas

Puede generar fácilmente una String como una representación textual del valor de fecha y hora. Puede ir con un formato estándar, su propio formato personalizado o un formato localizado automáticamente.

ISO 8601

Puede llamar a los métodos toString para obtener un formato de texto utilizando el estándar ISO 8601 común y razonable.

String output = instant.toString();

2016-03-23T03: 09: 01.613Z

Tenga en cuenta que para ZonedDateTime , el método toString extiende el estándar ISO 8601 al agregar el nombre de la zona horaria entre corchetes. Información extremadamente útil e importante, pero no estándar.

2016-03-22T20: 09: 01.613-08: 00 [América / Los_Angeles]

Formato personalizado

O especifique su propio patrón de formato particular con la clase DateTimeFormatter .

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "dd/MM/yyyy hh:mm a" );

Especifique una Locale para un idioma humano (inglés, French , etc.) que se usará para traducir el nombre de día / mes y también para definir normas culturales como el orden del año, el mes y la fecha. Tenga en cuenta que Locale no tiene nada que ver con la zona horaria.

formatter = formatter.withLocale( Locale.US ); // Or Locale.CANADA_FRENCH or such.
String output = zdt.format( formatter );

Localizando

Mejor aún, deje que java.time haga el trabajo de localización automáticamente.

DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM );
String output = zdt.format( formatter.withLocale( Locale.US ) );  // Or Locale.CANADA_FRENCH and so on.

Acerca de java.time

El marco java.time está integrado en Java 8 y java.time posteriores. Estas clases sustituyen a las antiguas y problemáticas clases de fecha y hora como java.util.Date , java.util.Calendar y SimpleDateFormat .

El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .

Para obtener más información, consulte el Tutorial de Oracle . Y busca para muchos ejemplos y explicaciones. La especificación es JSR 310 .

Puede intercambiar objetos java.time directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No se necesitan cadenas, no se necesitan clases java.sql.* .

¿Dónde obtener las clases java.time?

  • Java SE 8 , Java SE 9 , Java SE 10 y posteriores
    • Incorporado.
    • Parte de la API de Java estándar con una implementación en paquete.
    • Java 9 agrega algunas características menores y correcciones.
  • Java SE 6 y Java SE 7
    • Gran parte de la funcionalidad de java.time está respaldada a Java 6 y 7 en ThreeTen-Backport .
  • Android
    • Versiones posteriores de las implementaciones de paquetes de Android de las clases java.time.
    • Para Android anterior (<26), el proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente). Vea Cómo usar ThreeTenABP… .

El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí como Interval , YearWeek , YearQuarter , y more .


Bueno, tuve problemas con algunas respuestas de la API, así que fusiono este código, espero que les sirva a los chicos:

    Time t = new Time(Time.getCurrentTimezone());
    t.setToNow();
    String date1 = t.format("%Y/%m/%d");

    Date date = new Date(System.currentTimeMillis());
    SimpleDateFormat dateFormat = new SimpleDateFormat("hh:mm aa",
            Locale.ENGLISH);
    String var = dateFormat.format(date);
    String horafecha = var+ " - " + date1;

    tvTime.setText(horafecha);

Salida: 03:25 PM - 2017/10/03


El método que se muestra a continuación devolverá la fecha y la hora actual en Cadena. Use una zona horaria diferente según su zona horaria real. He usado GMT

public static String GetToday(){
    Date presentTime_Date = Calendar.getInstance().getTime();
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
    return dateFormat.format(presentTime_Date);
}

En realidad, es más seguro establecer la zona horaria actual establecida en el dispositivo con Time.getCurrentTimezone() , o de lo contrario obtendrá la hora actual en UTC.

Time today = new Time(Time.getCurrentTimezone());
today.setToNow();

Luego, puede obtener todos los campos de fecha que desee, como, por ejemplo:

textViewDay.setText(today.monthDay + "");             // Day of the month (1-31)
textViewMonth.setText(today.month + "");              // Month (0-11)
textViewYear.setText(today.year + "");                // Year 
textViewTime.setText(today.format("%k:%M:%S"));  // Current time

Ver la clase android.text.format.Time para todos los detalles.

ACTUALIZAR

Como muchas personas señalan, Google dice que esta clase tiene varios problemas y que se supone que ya no se debe usar:

Esta clase tiene varios problemas y se recomienda que se utilice GregorianCalendar en su lugar.

Problemas conocidos:

Por razones históricas, cuando se realizan cálculos de tiempo, toda la aritmética tiene lugar actualmente utilizando enteros de 32 bits. Esto limita el intervalo de tiempo confiable representable desde 1902 hasta 2037. Consulte el artículo de wikipedia sobre el problema del año 2038 para obtener más información. No confíe en este comportamiento; puede cambiar en el futuro Llamar a switchTimezone (String) en una fecha que no puede existir, como un tiempo de pared omitido debido a una transición DST, dará como resultado una fecha en 1969 (es decir, -1, o 1 segundo antes del 1 de enero de 1970 UTC). Gran parte del formato / análisis asume el texto ASCII y, por lo tanto, no es adecuado para su uso con scripts que no sean ASCII.


Existen varias opciones, ya que Android es principalmente Java, pero si desea escribirlo en un textView, el siguiente código hará el truco:

String currentDateTimeString = DateFormat.getDateInstance().format(new Date());

// textView is the TextView view that should display it
textView.setText(currentDateTimeString);

Fácil, puede analizar la hora para obtener valores separados para la hora actual, de la siguiente manera:

Calendar cal = Calendar.getInstance(); 

  int millisecond = cal.get(Calendar.MILLISECOND);
  int second = cal.get(Calendar.SECOND);
  int minute = cal.get(Calendar.MINUTE);
        //12 hour format
  int hour = cal.get(Calendar.HOUR);
        //24 hour format
  int hourofday = cal.get(Calendar.HOUR_OF_DAY);

Lo mismo ocurre con la fecha, como sigue:

Calendar cal = Calendar.getInstance(); 

  int dayofyear = cal.get(Calendar.DAY_OF_YEAR);
  int year = cal.get(Calendar.YEAR);
  int dayofweek = cal.get(Calendar.DAY_OF_WEEK);
  int dayofmonth = cal.get(Calendar.DAY_OF_MONTH);

Para aquellos que prefieran un formato personalizado, puede utilizar:

DateFormat df = new SimpleDateFormat("EEE, d MMM yyyy, HH:mm");
String date = df.format(Calendar.getInstance().getTime());

Mientras que puedes tener patrones DateFormat como:

"yyyy.MM.dd G 'at' HH:mm:ss z" ---- 2001.07.04 AD at 12:08:56 PDT
"hh 'o''clock' a, zzzz" ----------- 12 o'clock PM, Pacific Daylight Time
"EEE, d MMM yyyy HH:mm:ss Z"------- Wed, 4 Jul 2001 12:08:56 -0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ"------- 2001-07-04T12:08:56.235-0700
"yyMMddHHmmssZ"-------------------- 010704120856-0700
"K:mm a, z" ----------------------- 0:08 PM, PDT
"h:mm a" -------------------------- 12:08 PM
"EEE, MMM d, ''yy" ---------------- Wed, Jul 4, '01

Para calcular la hora actual, puede usar System.currentTimeMillis() que es estándar en Java. Luego puedes usarlo para crear una fecha.

Date currentDate = new Date(System.currentTimeMillis());

Y como mencionan otros para crear un tiempo.

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

Para un formato de fecha y hora personalizado:

    SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ",Locale.ENGLISH);
    String cDateTime=dateFormat.format(new Date());

La salida es como el siguiente formato: 2015-06-18T10: 15: 56-05: 00


Podrías usar:

import java.util.Calendar

Date currentTime = Calendar.getInstance().getTime();

Hay un montón de constantes en el Calendario para todo lo que necesitas.

Editar:
Consultar la documentación de la clase de calendario.


Puede ( pero ya no debería , vea más abajo) usar android.text.format.Time :

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

De la referencia vinculada anteriormente:

La clase Time es un reemplazo más rápido para las clases java.util.Calendar y java.util.GregorianCalendar. Una instancia de la clase Time representa un momento en el tiempo, especificado con una segunda precisión.

NOTA 1: Han pasado varios años desde que escribí esta respuesta, y se trata de una clase antigua, específica de Android y ahora en desuso. Google ahora android.text.format.Time que "[t] su clase tiene varios problemas y se recomienda que se use GregorianCalendar su lugar".

NOTA 2: Aunque la clase Time tiene un toMillis(ignoreDaylightSavings) , esto es simplemente una conveniencia para pasar a métodos que esperan tiempo en milisegundos. El valor del tiempo es solo preciso a un segundo ; La porción de milisegundos es siempre 000 . Si en un bucle haces

Time time = new Time();   time.setToNow();
Log.d("TIME TEST", Long.toString(time.toMillis(false)));
... do something that takes more than one millisecond, but less than one second ...

La secuencia resultante repetirá el mismo valor, como 1410543204000 , hasta que 1410543204000 el segundo siguiente, momento en el que comenzará a repetirse 1410543205000 .


Puedes obtener la fecha usando:

Time t = new Time(Time.getCurrentTimezone());
t.setToNow();
String date = t.format("%Y/%m/%d");

Esto le dará un resultado en forma agradable, como en este ejemplo: "2014/02/09".


Si desea obtener la fecha y la hora en un patrón específico, puede utilizar lo siguiente:

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
String currentDateandTime = sdf.format(new Date());

Si necesita la fecha actual,

Calendar cc = Calendar.getInstance();
int year=cc.get(Calendar.YEAR);
int month=cc.get(Calendar.MONTH);
int mDay = cc.get(Calendar.DAY_OF_MONTH);
System.out.println("Date", year+":"+month+":"+mDay);

Si necesitas hora actual,

 int mHour = cc.get(Calendar.HOUR_OF_DAY);
 int mMinute = cc.get(Calendar.MINUTE);
 System.out.println("time_format"+String.format("%02d:%02d", mHour , mMinute ));

intenta usar el siguiente código:

 Date date = new Date();
 SimpleDateFormat dateFormatWithZone = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",Locale.getDefault());  
 String currentDate = dateFormatWithZone.format(date);

simplemente puede utilizar el siguiente código:

 DateFormat df = new SimpleDateFormat("HH:mm"); //format time
 String time = df.format(Calendar.getInstance().getTime());

 DateFormat df1=new SimpleDateFormat("yyyy/MM/dd");//foramt date
 String date=df1.format(Calendar.getInstance().getTime());

    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    Calendar cal = Calendar.getInstance();
    System.out.println("time => " + dateFormat.format(cal.getTime()));

    String time_str = dateFormat.format(cal.getTime());

    String[] s = time_str.split(" ");

    for (int i = 0; i < s.length; i++) {
         System.out.println("date  => " + s[i]);
    }

    int year_sys = Integer.parseInt(s[0].split("/")[0]);
    int month_sys = Integer.parseInt(s[0].split("/")[1]);
    int day_sys = Integer.parseInt(s[0].split("/")[2]);

    int hour_sys = Integer.parseInt(s[1].split(":")[0]);
    int min_sys = Integer.parseInt(s[1].split(":")[1]);

    System.out.println("year_sys  => " + year_sys);
    System.out.println("month_sys  => " + month_sys);
    System.out.println("day_sys  => " + day_sys);

    System.out.println("hour_sys  => " + hour_sys);
    System.out.println("min_sys  => " + min_sys);

Date todayDate = new Date();
todayDate.getDay();
todayDate.getHours();
todayDate.getMinutes();
todayDate.getMonth();
todayDate.getTime();

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

Intenta esto funciona para mí también.


Time time = new Time();
time.setToNow();
System.out.println("time: " + time.hour+":"+time.minute);

Esto te dará, por ejemplo, 12:32.

Recuerde importar android.text.format.Time;





time