actualizar - java descargar
¿Cómo obtener el momento actual en formato ISO 8601 con fecha, hora y minuto? (21)
¿Cuál es la forma más elegante de obtener la presentación con formato ISO 8601 del momento actual, UTC? Debería parecer: 2010-10-12T08:50Z
.
Ejemplo:
String iso8601 = DateFormat.getDateTimeInstance(DateFormat.ISO_8601).format(date);
Java 8 Native
java.time hace simple desde Java 8. Y seguro para subprocesos.
ZonedDateTime.now( ZoneOffset.UTC ).format( DateTimeFormatter.ISO_INSTANT )
Resultado: 2015-04-14T11:07:36.639Z
Puede sentir la tentación de usar
Temporal
más ligero, comoInstant
oLocalDateTime
, pero carece de soporte de formateador o de datos de zona horaria. SoloZonedDateTime
trabaja fuera de la caja.
Al ajustar o encadenar las opciones / operaciones de ZonedDateTime y DateTimeFormatter , puede controlar fácilmente la timezone y la precision , hasta cierto punto:
ZonedDateTime.now( ZoneId.of( "Europe/Paris" ) )
.truncatedTo( ChronoUnit.MINUTES )
.format( DateTimeFormatter.ISO_DATE_TIME )
Resultado: 2015-04-14T11:07:00+01:00[Europe/Paris]
Los requisitos refinados, como la eliminación de la parte de segundos, todavía deben cumplirse mediante formatos personalizados o un proceso posterior personalizado.
.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) // 2015-04-14T11:07:00
.format( DateTimeFormatter.ISO_LOCAL_DATE ) // 2015-04-14
.format( DateTimeFormatter.ISO_LOCAL_TIME ) // 11:07:00
.format( DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm" ) ) // 2015-04-14 11:07
Para Java 6 y 7, puede considerar puertos posteriores de java.time, como ThreeTen-Backport , que también tiene un puerto de Android . Ambos son más ligeros que Joda, y han aprendido de la experience de Joda - esp. Teniendo en cuenta que java.time está diseñado por el autor de Joda.
Tiempo de joda
Actualización: el proyecto Joda-Time ahora está en modo de mantenimiento , con el equipo que aconseja la migración a las clases de java.time . Para Java 6 y 7, vea el proyecto ThreeTen-Backport , más adaptado para Android en el proyecto ThreeTenABP .
Usando la biblioteca de Joda-Time ...
String output = new DateTime( DateTimeZone.UTC ).toString() ;
Esto es seguro para subprocesos. Joda-Time crea nuevos objetos inmutables en lugar de cambiar objetos existentes.
Si realmente pretendía solicitar un formato sin segundos, resolviéndolo en minutos, entonces use uno de los muchos otros formateadores integrados en Joda-Time.
DateTime now = new DateTime( DateTimeZone.UTC ) ;
String output = ISODateTimeFormat.dateHourMinute.print( now ) ;
java.time
Para Java 8 y versiones posteriores, Joda-Time sigue funcionando. Pero el marco java.time reemplaza a Joda-Time. Entonces migre su código de Joda-Time a java.time tan pronto como sea conveniente.
Vea mi otra respuesta para una solución moderna.
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
, 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 .
tl; dr
Algunas de las otras Respuestas son correctas al recomendar clases de java.time pero utilizan longitudes innecesarias para sus necesidades específicas.
Instant.now() // Capture the current moment in UTC with a resolution as fines nanoseconds but usually in microseconds or milliseconds.
.truncatedTo( ChronoUnit.MINUTES ) // Lop off any seconds or fractional second, to get a value in whole minutes.
.toString() // Generate a String in standard ISO 8601 format where a `T` separates the year-month-day from the hour-minute-second, and the `Z` on the end for “Zulu” means UTC.
2018-01-23T12: 34Z
Instant::toString
La clase jav.time.Instant
representa un momento en UTC, siempre en UTC.
Instant instant = Instant.now() ;
instant.toString (): 2018-01-23T12: 34: 56.123456Z
La Z
en el final de la cadena de ejemplo 2010-10-12T08:50Z
se pronuncia "Zulu" y significa UTC .
Su formato deseado cumple con la norma ISO 8601 . Las clases java.time utilizan estos formatos estándar de forma predeterminada al analizar / generar cadenas. Así que no hay necesidad de especificar un patrón de formato. Simplemente llame a Instant::toString
como se ve arriba.
Si desea específicamente minutos enteros sin segundo o segundo fraccional, trunque. Especifique una unidad de tiempo a través de la clase ChronoUnit
.
Instant instant = Instant.now().truncatedTo( ChronoUnit.MINUTES ) ;
String output = instant.toString(); // Generate a `String` object in standard ISO 8601 format.
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
, 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 .
A partir de Java 8 puedes simplemente hacer:
Instant.now().toString();
Desde los documentos java.time.Instant
:
now
public static Instant now()
Obtiene el instante actual del reloj del sistema.
Esto consultará el reloj UTC del sistema para obtener el instante actual.
toString
public String toString()
Una representación de cadena de este instante utilizando la representación ISO-8601.
El formato utilizado es el mismo que
DateTimeFormatter.ISO_INSTANT
.
Aquí hay una clase completa optimizada para que invocar "now ()" no haga nada más que lo que tiene que hacer.
public class Iso8601Util
{
private static TimeZone tz = TimeZone.getTimeZone("UTC");
private static DateFormat df = new SimpleDateFormat("yyyy-MM-dd''T''HH:mm''Z''");
static
{
df.setTimeZone(tz);
}
public static String now()
{
return df.format(new Date());
}
}
Creo que la forma más fácil es ir primero al instante y luego encadenar como:
String d = new Date().toInstant().toString();
Lo que resultará en:
2017-09-08T12:56:45.331Z
Deberían haber agregado algún tipo de manera sencilla de pasar de Fecha a Instant y también un método llamado toISO8601
, que es lo que mucha gente está buscando. Como complemento a otras respuestas, desde un formato java.util.Date a ISO 8601:
Instant.ofEpochMilli(date.getTime()).toString();
No es realmente visible cuando se utiliza la finalización automática, pero: java.time.Instant.toString()
:
Una representación de cadena de este instante usando ISO-8601
ISO 8601 puede contener segundos, consulte http://en.wikipedia.org/wiki/ISO_8601#Times
por lo que el código debe ser
DateFormat df = new SimpleDateFormat("yyyy-MM-dd''T''HH:mm:ss''Z''");
Lo hice en Android usando Calendar y SimpleDateFormat. El siguiente método devuelve un calendario con la zona horaria "GMT" (esta es la zona horaria universal). Luego, puede usar la clase Calendario para establecer la hora entre diferentes zonas horarias, utilizando el método setTimeZone () de la clase Calendario.
private static final String GMT = "GMT";
private static final String DATE_FORMAT_ISO = "yyyyMMdd''T''HHmmss";
public static Calendar isoToCalendar(final String inputDate) {
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(GMT));
try {
SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT_ISO, Locale.US);
dateFormat.setTimeZone(TimeZone.getTimeZone(GMT));
Date date = dateFormat.parse(inputDate);
calendar.setTime(date);
} catch (ParseException e) {
Log.e("TAG",e.getMessage());
}
return calendar;
}
RECUERDE: La clase de fecha no sabe acerca de la existencia de la zona horaria. Por este motivo, si depura una fecha, siempre verá la fecha de su zona horaria actual.
Para Java versión 7
Puede seguir la documentación de Oracle: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
X - se utiliza para la zona horaria ISO 8601
TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd''T''HH:mm:ssX");
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());
System.out.println(nowAsISO);
DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd''T''HH:mm:ssX");
//nowAsISO = "2013-05-31T00:00:00Z";
Date finalResult = df1.parse(nowAsISO);
System.out.println(finalResult);
Para sistemas donde la Zona horaria predeterminada no es UTC:
TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd''T''HH:mm''Z''");
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());
La instancia SimpleDateFormat
puede declararse como una constante global si es necesario con frecuencia, pero tenga en cuenta que esta clase no es segura para subprocesos. Debe estar sincronizado si se accede simultáneamente por varios subprocesos.
EDITAR: Preferiría Joda Time si hiciera muchas manipulaciones de fecha / hora diferentes ...
EDIT2: corregido: setTimeZone
no acepta una cadena (corregida por Paul)
Podría usar el SimpleDateFormat de Java con el siguiente patrón yyyy-MM-dd''T''HH:mm:ssXXX
para ISO 8601.
Código de muestra: (listas para todas las zonas horarias disponibles)
for (String timeZone : TimeZone.getAvailableIDs())
{
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd''T''HH:mm:ssXXX");
dateFormat.setTimeZone(TimeZone.getTimeZone(timeZone));
String formatted = dateFormat.format(new Date());
System.out.print(formatted);
if (formatted.endsWith("Z"))
{
// These time zone''s have offset of ''0'' from GMT.
System.out.print("/t(" + timeZone + ")");
}
System.out.println();
}
Podrías usar:
TimeZone.getDefault ()
para la zona horaria predeterminada vm. Más here
Es posible que note la fecha y hora de algunas zonas horarias que terminan con ''Z''
. Estas zonas horarias tienen desplazamiento de ''0''
de GMT.
Más información se puede encontrar here .
Prueba esto,
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd''T''HH:mm:ss.SSSSSSSZ");
String date=sdf.format (new Date() );
Su formato ISO 8601
Si no quieres incluir Jodatime (tan bonito como es)
javax.xml.bind.DatatypeConverter.printDateTime(
Calendar.getInstance(TimeZone.getTimeZone("UTC"))
);
que devuelve una cadena de:
2012-07-10T16:02:48.440Z
que es ligeramente diferente a la solicitud original pero sigue siendo ISO-8601.
Sin embargo, joda-time solo es compatible con el formato extendido: "2015-12-09T00: 22: 42.930Z" no es el básico: "20151209T002242.930Z" ... es mejor que probemos una lista de formatos con java SimpleDateFormat.
Utilice SimpleDateFormat
para formatear cualquier objeto de Date
que desee:
TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd''T''HH:mm''Z''"); // Quoted "Z" to indicate UTC, no timezone offset
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());
El uso de una new Date()
como se muestra arriba dará formato a la hora actual.
usa JodaTime
El sistema de calendario ISO 8601 es la implementación predeterminada dentro de Joda-Time
Here está el documento para JodaTime Formatter
Editar:
Si no desea agregar o si no ve el valor de agregar la biblioteca anterior, puede usar la clase SimpleDateFormat
incorporada para formatear la fecha al formato ISO requerido
según lo sugerido por @Joachim Sauer
DateFormat df = new SimpleDateFormat("yyyy-MM-dd''T''HH:mmZ");
String nowAsString = df.format(new Date());
DateFormatUtils de Apache commons-lang3
tienen constantes útiles, por ejemplo: DateFormatUtils.ISO_DATETIME_FORMAT
Java 8:
thisMoment = DateTimeFormatter.ofPattern("yyyy-MM-dd''T''HH:mmX")
.withZone(ZoneOffset.UTC)
.format(Instant.now());
Pre Java 8:
thisMoment = String.format("%tFT%<tRZ",
Calendar.getInstance(TimeZone.getTimeZone("Z")));
De la documentación :
''R''
Hora formateada para el reloj de 24 horas como "% tH:% tM"
''F''
ISO 8601 fecha completa formateada como "% tY-% tm-% td".
DateTimeFormatter.ISO_DATE_TIME
.withZone(ZoneOffset.UTC)
.format(yourDateObject.toInstant())
private static String getCurrentDateIso()
{
// Returns the current date with the same format as Javascript''s new Date().toJSON(), ISO 8601
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd''T''HH:mm:ss.SSS''Z''", Locale.US);
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
return dateFormat.format(new Date());
}