Saltar al contenido

Convertir fecha de Java a cadena UTC

Solución:

tl; dr

Tu preguntaste:

Estaba buscando una frase de una sola línea como:

Pide y recibirás. Convertir de terrible clase de legado Date a su reemplazo moderno, Instant.

myJavaUtilDate.toInstant().toString()

2020-05-05T19: 46: 12.912Z

java.time

En Java 8 y posteriores tenemos el nuevo paquete java.time integrado (Tutorial). Inspirado en Joda-Time, definido por JSR 310, y ampliado por el proyecto ThreeTen-Extra.

La mejor solución es ordena tus objetos de fecha y hora en lugar de cadenas. Pero si debe trabajar en cadenas, siga leyendo.

Un Instant representa un momento en la línea de tiempo, básicamente en UTC (consulte el documento de la clase para obtener detalles precisos). los toString la implementación utiliza el DateTimeFormatter.ISO_INSTANT formato por defecto. Este formato incluye cero, tres, seis o nueve dígitos según sea necesario para mostrar una fracción de segundo hasta una precisión de nanosegundos.

String output = Instant.now().toString(); // Example: '2015-12-03T10:15:30.120Z'

Si debe interoperar con el viejo Date class, convierta a / desde java.time a través de nuevos métodos agregados a las clases antiguas. Ejemplo: Date::toInstant.

myJavaUtilDate.toInstant().toString()

Es posible que desee utilizar un formateador alternativo si necesita una cantidad constante de dígitos en una fracción de segundo o si no necesita una fracción de segundo.

Otra ruta si desea truncar fracciones de segundo es usar ZonedDateTime en lugar de Instant, llamando a su método para cambiar la fracción a cero.

Tenga en cuenta que debemos especificar una zona horaria para ZonedDateTime (de ahí el nombre). En nuestro caso, eso significa UTC. La subclase de ZoneID, ZoneOffset, mantiene una constante conveniente para UTC. Si omitimos la zona horaria, la zona horaria predeterminada actual de la JVM se aplica implícitamente.

String output = ZonedDateTime.now( ZoneOffset.UTC ).withNano( 0 ).toString();  // Example: 2015-08-27T19:28:58Z

Tabla de tipos de fecha y hora en Java, tanto moderno como heredado


Sobre java.time

los java.time framework está integrado en Java 8 y versiones posteriores. Estas clases suplantan a las antiguas y problemáticas clases de fecha y hora heredadas, como java.util.Date, CalendarY SimpleDateFormat.

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.

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

Puedes intercambiar java.time objetos directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. Sin necesidad de cuerdas, sin necesidad de java.sql.* clases. Compatibilidad con Hibernate 5 y JPA 2.2 java.time.

¿Dónde obtener las clases java.time?

  • Java SE 8, Java SE 9, Java SE 10, Java SE 11y posterior: parte de la API estándar de Java con una implementación integrada.

    • Java 9 agrega algunas funciones y correcciones menores.
  • Java SE 6 y Java SE 7

    • La mayoría de java.time la funcionalidad está respaldada a Java 6 y 7 en ThreeTen-Backport.
  • Androide

    • Versiones posteriores de implementaciones de paquetes de Android del java.time clases.
    • Para Android anterior (<26), el ThreeTenABP el proyecto se adapta ThreeTen-Backport (mencionado anteriormente). Ver Cómo usar ThreeTenABP….

Joda-Time

ACTUALIZAR: El proyecto Joda -Time ahora está en modo de mantenimiento, y el equipo aconseja la migración a las clases java.time.

Estaba buscando una sola línea

Fácil si usa la biblioteca Joda-Time 2.3. ISO 8601 es el formato predeterminado.

Zona horaria

En el ejemplo de código a continuación, tenga en cuenta que estoy especificando una zona horaria en lugar de depender de la zona horaria predeterminada. En este caso, estoy especificando UTC según su pregunta. los Z al final, hablado como “zulú”, significa que no hay diferencia de zona horaria con respecto a UTC.

Código de ejemplo

// import org.joda.time.*;

String output = new DateTime( DateTimeZone.UTC );

Producción…

2013-12-12T18:29:50.588Z

Siguiendo los útiles comentarios, he reconstruido completamente el formateador de fechas. Se supone que el uso:

  • Sea corto (un trazador de líneas)
  • Representar objetos desechables (zona horaria, formato) como cadenas
  • Admite formatos ISO útiles y clasificables y el formato heredado de la caja

Si considera que este código es útil, puedo publicar la fuente y un JAR en github.

Uso

// The problem - not UTC
Date.toString()                      
"Tue Jul 03 14:54:24 IDT 2012"

// ISO format, now
PrettyDate.now()        
"2012-07-03T11:54:24.256 UTC"

// ISO format, specific date
PrettyDate.toString(new Date())         
"2012-07-03T11:54:24.256 UTC"

// Legacy format, specific date
PrettyDate.toLegacyString(new Date())   
"Tue Jul 03 11:54:24 UTC 2012"

// ISO, specific date and time zone
PrettyDate.toString(moonLandingDate, "yyyy-MM-dd hh:mm:ss zzz", "CST") 
"1969-07-20 03:17:40 CDT"

// Specific format and date
PrettyDate.toString(moonLandingDate, "yyyy-MM-dd")
"1969-07-20"

// ISO, specific date
PrettyDate.toString(moonLandingDate)
"1969-07-20T20:17:40.234 UTC"

// Legacy, specific date
PrettyDate.toLegacyString(moonLandingDate)
"Wed Jul 20 08:17:40 UTC 1969"

Código

(Este código también es el tema de una pregunta en Code Review stackexchange)

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

/**
 * Formats dates to sortable UTC strings in compliance with ISO-8601.
 * 
 * @author Adam Matan <[email protected]>
 * @see http://stackoverflow.com/questions/11294307/convert-java-date-to-utc-string/11294308
 */
public class PrettyDate {
    public static String ISO_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS zzz";
    public static String LEGACY_FORMAT = "EEE MMM dd hh:mm:ss zzz yyyy";
    private static final TimeZone utc = TimeZone.getTimeZone("UTC");
    private static final SimpleDateFormat legacyFormatter = new SimpleDateFormat(LEGACY_FORMAT);
    private static final SimpleDateFormat isoFormatter = new SimpleDateFormat(ISO_FORMAT);
    static {
        legacyFormatter.setTimeZone(utc);
        isoFormatter.setTimeZone(utc);
    }

    /**
     * Formats the current time in a sortable ISO-8601 UTC format.
     * 
     * @return Current time in ISO-8601 format, e.g. :
     *         "2012-07-03T07:59:09.206 UTC"
     */
    public static String now() {
        return PrettyDate.toString(new Date());
    }

    /**
     * Formats a given date in a sortable ISO-8601 UTC format.
     * 
     * <pre>
     * <code>
     * final Calendar moonLandingCalendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
     * moonLandingCalendar.set(1969, 7, 20, 20, 18, 0);
     * final Date moonLandingDate = moonLandingCalendar.getTime();
     * System.out.println("UTCDate.toString moon:       " + PrettyDate.toString(moonLandingDate));
     * >>> UTCDate.toString moon:       1969-08-20T20:18:00.209 UTC
     * </code>
     * </pre>
     * 
     * @param date
     *            Valid Date object.
     * @return The given date in ISO-8601 format.
     * 
     */

    public static String toString(final Date date) {
        return isoFormatter.format(date);
    }

    /**
     * Formats a given date in the standard Java Date.toString(), using UTC
     * instead of locale time zone.
     * 
     * <pre>
     * <code>
     * System.out.println(UTCDate.toLegacyString(new Date()));
     * >>> "Tue Jul 03 07:33:57 UTC 2012"
     * </code>
     * </pre>
     * 
     * @param date
     *            Valid Date object.
     * @return The given date in Legacy Date.toString() format, e.g.
     *         "Tue Jul 03 09:34:17 IDT 2012"
     */
    public static String toLegacyString(final Date date) {
        return legacyFormatter.format(date);
    }

    /**
     * Formats a date in any given format at UTC.
     * 
     * <pre>
     * <code>
     * final Calendar moonLandingCalendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
     * moonLandingCalendar.set(1969, 7, 20, 20, 17, 40);
     * final Date moonLandingDate = moonLandingCalendar.getTime();
     * PrettyDate.toString(moonLandingDate, "yyyy-MM-dd")
     * >>> "1969-08-20"
     * </code>
     * </pre>
     * 
     * 
     * @param date
     *            Valid Date object.
     * @param format
     *            String representation of the format, e.g. "yyyy-MM-dd"
     * @return The given date formatted in the given format.
     */
    public static String toString(final Date date, final String format) {
        return toString(date, format, "UTC");
    }

    /**
     * Formats a date at any given format String, at any given Timezone String.
     * 
     * 
     * @param date
     *            Valid Date object
     * @param format
     *            String representation of the format, e.g. "yyyy-MM-dd HH:mm"
     * @param timezone
     *            String representation of the time zone, e.g. "CST"
     * @return The formatted date in the given time zone.
     */
    public static String toString(final Date date, final String format, final String timezone) {
        final TimeZone tz = TimeZone.getTimeZone(timezone);
        final SimpleDateFormat formatter = new SimpleDateFormat(format);
        formatter.setTimeZone(tz);
        return formatter.format(date);
    }
}

El siguiente código simplificado, basado en la respuesta aceptada anterior, funcionó para mí:

public class GetSync {
    public static String ISO_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS zzz";
    private static final TimeZone utc = TimeZone.getTimeZone("UTC");
    private static final SimpleDateFormat isoFormatter = new SimpleDateFormat(ISO_FORMAT);
    static {
        isoFormatter.setTimeZone(utc);
    }

    public static String now() {
        return isoFormatter.format(new Date()).toString();
    }
}

Espero que esto ayude a alguien.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *