¿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
.
104
Puedes usar los captadores de java.time.LocalDateTime
para 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 int
a 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
SimpleDateFormat
oDateTimeFormatter
para esa tarea en particular :)new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).format(new Date());
Cambie a joda-time y puede hacerlo en tres líneas
También tiene acceso directo a los campos individuales de la fecha sin usar un Calendario.
La salida es la siguiente:
Según http://www.joda.org/joda-time/
fuente
fuente
Con Java 8 y posteriores, use el paquete java.time .
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 unint
valor.fuente
LocalDateTime
es 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. UtiliceInstant
,ZonedDateTime
o en suOffsetDateTime
lugar.ZonedDateTime
.tl; dr
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 ejemploAmerica/Montreal
,Africa/Casablanca
oPacific/Auckland
. Nunca use el 3-4 abreviatura de letras tales comoEST
oIST
, ya que son no verdaderas zonas de tiempo, no estandarizados, y ni siquiera único (!).Llame a cualquiera de los muchos captadores para extraer partes de la fecha y hora.
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
TimeUnit
enumeración para tal conversión.DateTimeFormatter
Para producir una
String
combinación de fragmentos de texto, useDateTimeFormatter
class. 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
.Y vuelve de nuevo.
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é
LocalDateTime
sirve? ÚseloLocalDateTime
cuando 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 (aZoneId
) para obtener unZonedDateTime
. 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 conZonedDateTime
. La Navidad en todas partes se representa con aLocalDateTime
.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
, ySimpleDateFormat
.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?
fuente
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.
fuente
new Date()
aquí. Pero, ¿cómo obtendría las partes separadas fácilmente según lo solicitado?java.sql.Timestamp
fue suplantado porjava.time.Instant
la llegada de JDBC 4.2.en java 7 Calendar una línea
fuente
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).
fuente
java.util.Date
,java.util.Calendar
yjava.text.SimpleDateFormat
ahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y versiones posteriores. Consulte el tutorial de Oracle .Calendario ahora = nuevo Calendario () // o nuevo GregorianCalendar (), o cualquier sabor que necesite
ahora MES ahora HORA
etc.
fuente
MONTH
yHOUR
son constantes estáticas deCalendar
, no propiedades de instancia.