¿Cómo obtener el año, mes, día, horas, minutos, segundos y milisegundos del momento actual en Java?

104

¿Cómo puedo obtener el año, mes, día, horas, minutos, segundos y milisegundos del momento actual en Java? Me gustaría tenerlos como Strings.

romano
fuente

Respuestas:

254

Puedes usar los captadores de java.time.LocalDateTimepara eso.

LocalDateTime now = LocalDateTime.now();
int year = now.getYear();
int month = now.getMonthValue();
int day = now.getDayOfMonth();
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
int millis = now.get(ChronoField.MILLI_OF_SECOND); // Note: no direct getter available.

System.out.printf("%d-%02d-%02d %02d:%02d:%02d.%03d", year, month, day, hour, minute, second, millis);

O, cuando aún no esté en Java 8, utilice java.util.Calendar.

Calendar now = Calendar.getInstance();
int year = now.get(Calendar.YEAR);
int month = now.get(Calendar.MONTH) + 1; // Note: zero based!
int day = now.get(Calendar.DAY_OF_MONTH);
int hour = now.get(Calendar.HOUR_OF_DAY);
int minute = now.get(Calendar.MINUTE);
int second = now.get(Calendar.SECOND);
int millis = now.get(Calendar.MILLISECOND);

System.out.printf("%d-%02d-%02d %02d:%02d:%02d.%03d", year, month, day, hour, minute, second, millis);

De cualquier manera, esto se imprime a partir de ahora:

2010-04-16 15: 15: 17.816

Para convertir un inta String, utilice String#valueOf().


Si su intención es, después de todo, organizarlos y mostrarlos en un formato de cadena amigable para los humanos, entonces mejor use Java8 java.time.format.DateTimeFormatter( tutorial aquí ),

LocalDateTime now = LocalDateTime.now();
String format1 = now.format(DateTimeFormatter.ISO_DATE_TIME);
String format2 = now.atZone(ZoneId.of("GMT")).format(DateTimeFormatter.RFC_1123_DATE_TIME);
String format3 = now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss", Locale.ENGLISH));

System.out.println(format1);
System.out.println(format2);
System.out.println(format3);

o cuando aún no esté en Java 8, use java.text.SimpleDateFormat:

Date now = new Date(); // java.util.Date, NOT java.sql.Date or java.sql.Timestamp!
String format1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH).format(now);
String format2 = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH).format(now);
String format3 = new SimpleDateFormat("yyyyMMddHHmmss", Locale.ENGLISH).format(now);

System.out.println(format1);
System.out.println(format2);
System.out.println(format3);

De cualquier manera, esto produce:

2010-04-16T15: 15: 17.816
Vie, 16 de abril de 2010 15:15:17 GMT
20100416151517

Ver también:

BalusC
fuente
Si va a usar printf, entonces también podría usar los formatos para Fecha / Hora en lugar de usar el paso intermedio, es decir, "% 1 $ tm% 1 $ te,% 1 $ tY", c (consulte java.util. Formateador para la sintaxis completa)
M. Jessup
1
@METRO. Jessup: Eso es realmente mejor. Sin embargo, nunca lo he usado, por lo que no pude ingresar desde la parte superior de la cabeza, lo anterior es solo para fines de demostración. Independientemente, prefiero agarrar SimpleDateFormato DateTimeFormatterpara esa tarea en particular :)
BalusC
Sugeriría encarecidamente usar joda-time, ya que es una API mucho más agradable y comprensible en comparación con las fechas y calendarios mal diseñados que ofrece Java directamente.
Kaitsu
Prefiero este, especialmente en el trabajo de i18n para obtener startTime o endTime:new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).format(new Date());
Eddy
1
Gran parte de la funcionalidad de java.time se ha actualizado a Java 6 y 7 en el proyecto ThreeTen-Backport .
Basil Bourque
30

Cambie a joda-time y puede hacerlo en tres líneas

DateTime jodaTime = new DateTime();

DateTimeFormatter formatter = DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss.SSS");
System.out.println("jodaTime = " + formatter.print(jodaTime));

También tiene acceso directo a los campos individuales de la fecha sin usar un Calendario.

System.out.println("year = " + jodaTime.getYear());
System.out.println("month = " + jodaTime.getMonthOfYear());
System.out.println("day = " + jodaTime.getDayOfMonth());
System.out.println("hour = " + jodaTime.getHourOfDay());
System.out.println("minute = " + jodaTime.getMinuteOfHour());
System.out.println("second = " + jodaTime.getSecondOfMinute());
System.out.println("millis = " + jodaTime.getMillisOfSecond());

La salida es la siguiente:

jodaTime = 2010-04-16 18:09:26.060

year = 2010
month = 4
day = 16
hour = 18
minute = 9
second = 26
millis = 60

Según http://www.joda.org/joda-time/

Joda-Time es la biblioteca de fecha y hora estándar de facto para Java. Desde Java SE 8 en adelante, se solicita a los usuarios que migren a java.time (JSR-310).

corona
fuente
1
Para su información, el proyecto Joda-Time está ahora en mantenimiento, y su equipo asesora sobre la migración a las clases java.time. Tanto Joda-Time como java.time están dirigidos por el mismo hombre, Stephen Colebourne.
Basil Bourque
7
    // Java 8
    System.out.println(LocalDateTime.now().getYear());       // 2015
    System.out.println(LocalDateTime.now().getMonth());      // SEPTEMBER
    System.out.println(LocalDateTime.now().getDayOfMonth()); // 29
    System.out.println(LocalDateTime.now().getHour());       // 7
    System.out.println(LocalDateTime.now().getMinute());     // 36
    System.out.println(LocalDateTime.now().getSecond());     // 51
    System.out.println(LocalDateTime.now().get(ChronoField.MILLI_OF_SECOND)); // 100

    // Calendar
    System.out.println(Calendar.getInstance().get(Calendar.YEAR));         // 2015
    System.out.println(Calendar.getInstance().get(Calendar.MONTH ) + 1);   // 9
    System.out.println(Calendar.getInstance().get(Calendar.DAY_OF_MONTH)); // 29
    System.out.println(Calendar.getInstance().get(Calendar.HOUR_OF_DAY));  // 7
    System.out.println(Calendar.getInstance().get(Calendar.MINUTE));       // 35
    System.out.println(Calendar.getInstance().get(Calendar.SECOND));       // 32
    System.out.println(Calendar.getInstance().get(Calendar.MILLISECOND));  // 481

    // Joda Time
    System.out.println(new DateTime().getYear());           // 2015
    System.out.println(new DateTime().getMonthOfYear());    // 9
    System.out.println(new DateTime().getDayOfMonth());     // 29
    System.out.println(new DateTime().getHourOfDay());      // 7
    System.out.println(new DateTime().getMinuteOfHour());   // 19
    System.out.println(new DateTime().getSecondOfMinute()); // 16
    System.out.println(new DateTime().getMillisOfSecond()); // 174

    // Formatted
    // 2015-09-28 17:50:25.756
    System.out.println(new Timestamp(System.currentTimeMillis()));

    // 2015-09-28T17:50:25.772
    System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH).format(new Date()));

    // Java 8
    // 2015-09-28T17:50:25.810
    System.out.println(LocalDateTime.now());

    // joda time
    // 2015-09-28 17:50:25.839
    System.out.println(DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss.SSS").print(new org.joda.time.DateTime()));
blueberry0xff
fuente
Esta respuesta realmente aborda la Pregunta, que preguntaba sobre el acceso a los componentes de un valor de fecha y hora (no las cadenas formateadas habituales).
Basil Bourque
6

Con Java 8 y posteriores, use el paquete java.time .

ZonedDateTime.now().getYear();
ZonedDateTime.now().getMonthValue();
ZonedDateTime.now().getDayOfMonth();
ZonedDateTime.now().getHour();
ZonedDateTime.now().getMinute();
ZonedDateTime.now().getSecond();

ZonedDateTime.now()es un método estático que devuelve la fecha y hora actual del reloj del sistema en la zona horaria predeterminada. Todos los métodos de obtención devuelven un intvalor.

Ortomala Lokni
fuente
LocalDateTimees precisamente la clase incorrecta para esto. Carente de cualquier concepto de zona horaria o compensar-from-UTC, que no puede ser usado para rastrear un momento específico, es no un punto en la línea de tiempo. Utilice Instant, ZonedDateTimeo en su OffsetDateTimelugar.
Basil Bourque
Tienes razón. Modifiqué mi respuesta para usar un ZonedDateTime.
Ortomala Lokni
3

tl; dr

ZonedDateTime.now(                    // Capture current moment as seen in the wall-clock time used by the people of a particular region (a time zone).
    ZoneId.of( "America/Montreal" )   // Specify desired/expected time zone. Or pass `ZoneId.systemDefault` for the JVM’s current default time zone.
)                                     // Returns a `ZonedDateTime` object.
.getMinute()                          // Extract the minute of the hour of the time-of-day from the `ZonedDateTime` object.

42

ZonedDateTime

Para capturar el momento actual como se ve en la hora del reloj de pared que usa la gente de una región en particular (una zona horaria), use ZonedDateTime .

Una zona horaria es crucial para determinar una fecha. Para un momento dado, la fecha varía en todo el mundo según la zona. Por ejemplo, unos minutos después de la medianoche en París, Francia es un nuevo día, mientras que todavía es “ayer” en Montreal, Québec .

Si no se especifica ninguna zona horaria, la JVM aplica implícitamente su zona horaria predeterminada actual. Ese valor predeterminado puede cambiar en cualquier momento durante el tiempo de ejecución (!), Por lo que sus resultados pueden variar. Es mejor especificar la zona horaria deseada / esperada explícitamente como argumento.

Especifique un nombre de zona horaria adecuado en el formato de continent/region, por ejemplo America/Montreal,Africa/Casablanca o Pacific/Auckland. Nunca use el 3-4 abreviatura de letras tales como ESTo IST, ya que son no verdaderas zonas de tiempo, no estandarizados, y ni siquiera único (!).

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

Llame a cualquiera de los muchos captadores para extraer partes de la fecha y hora.

int    year        = zdt.getYear() ;
int    monthNumber = zdt.getMonthValue() ;
String monthName   = zdt.getMonth().getDisplayName( TextStyle.FULL , Locale.JAPAN ) ;  // Locale determines human language and cultural norms used in localizing. Note that `Locale` has *nothing* to do with time zone.
int    dayOfMonth  = zdt.getDayOfMonth() ;
String dayOfWeek   = zdt.getDayOfWeek().getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) ; 
int    hour        = zdt.getHour() ;  // Extract the hour from the time-of-day.
int    minute      = zdt.getMinute() ;
int    second      = zdt.getSecond() ;
int    nano        = zdt.getNano() ;

Las clases java.time se resuelven en nanosegundos . Su pregunta solicitó la fracción de segundo en milisegundos . Obviamente, puede dividir por un millón para truncar nanosegundos a milisegundos, a costa de una posible pérdida de datos. O use la TimeUnitenumeración para tal conversión.

long millis = TimeUnit.NANOSECONDS.toMillis( zdt.getNano() ) ;

DateTimeFormatter

Para producir una Stringcombinación de fragmentos de texto, use DateTimeFormatterclass. Busque Stack Overflow para obtener más información sobre esto.

Instant

Por lo general, es mejor realizar un seguimiento de los momentos en UTC. Para ajustar de una fecha y hora dividida en zonas a UTC, extraiga un archivo Instant.

Instant instant = zdt.toInstant() ;

Y vuelve de nuevo.

ZonedDateTime zdt = instant.atZone( ZoneId.of( "Africa/Tunis" ) ) ;

LocalDateTime

Un par de otras Respuestas usan la LocalDateTime clase. Esa clase no es apropiada para el propósito de rastrear momentos reales, momentos específicos en la línea de tiempo, ya que intencionalmente carece de cualquier concepto de zona horaria o desviación de UTC.

Entonces, ¿para qué LocalDateTimesirve? Úselo LocalDateTimecuando desee aplicar una fecha y hora a cualquier localidad o todas las localidades , en lugar de una localidad específica.

Por ejemplo, la Navidad de este año comienza en el LocalDateTime.parse( "2018-12-25T00:00:00" ). Ese valor no tiene significado hasta que aplica una zona horaria (a ZoneId) para obtener un ZonedDateTime. La Navidad ocurre primero en Kiribati , luego en Nueva Zelanda y el Lejano Oriente de Asia. Horas más tarde comienza la Navidad en India. Más hora después en África y Europa. Y todavía no es Navidad en las Américas hasta varias horas después. Navidad a partir de cualquiera de un lugar debe ser representado con ZonedDateTime. La Navidad en todas partes se representa con a LocalDateTime.


Acerca de java.time

El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases de fecha y hora como java.util.Date, 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 busque Stack Overflow para obtener 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 cuerdas, no se necesitan java.sql.*clases.

¿Dónde obtener las clases java.time?

Albahaca Bourque
fuente
2

O use java.sql.Timestamp. El calendario es un poco pesado, recomendaría no usarlo en el código de producción. Joda es mejor.

import java.sql.Timestamp;

public class DateTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(new Timestamp(System.currentTimeMillis()));
    }
}
pavel
fuente
Creo que entendió mal tanto la pregunta como el uso de la marca de tiempo sql. Normalmente lo usaría new Date()aquí. Pero, ¿cómo obtendría las partes separadas fácilmente según lo solicitado?
BalusC
FYI, java.sql.Timestampfue suplantado por java.time.Instantla llegada de JDBC 4.2.
Basil Bourque
0

en java 7 Calendar una línea

new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").format(Calendar.getInstance().getTime())
Lucke
fuente
1
Las problemáticas clases Calendar y SimpleDateFormat ahora están desactualizadas, reemplazadas por completo por las clases java.time. Consulte la Respuesta de BalusC para conocer el enfoque moderno. Gran parte de la funcionalidad de java.time se ha actualizado a Java 6 y 7 en el proyecto ThreeTen-Backport .
Basil Bourque
-2

Mire la documentación de la API para la clase java.util.Calendar y sus derivados (puede que le interese específicamente la clase GregorianCalendar).

M. Jessup
fuente
Para su información, las problemáticas clases antiguas de fecha y hora como java.util.Date, java.util.Calendary java.text.SimpleDateFormatahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y versiones posteriores. Consulte el tutorial de Oracle .
Basil Bourque
-2

Calendario ahora = nuevo Calendario () // o nuevo GregorianCalendar (), o cualquier sabor que necesite

ahora MES ahora HORA

etc.

llappall
fuente
3
Hola, tengo dificultades para entender por qué está repitiendo una respuesta ya dada de manera deficiente. Por favor, desarrolle :)
BalusC
3
MONTHy HOURson constantes estáticas de Calendar, no propiedades de instancia.
Joseph Earl