Comment obtenir l'instant actuel au format ISO 8601 avec la date, l'heure et les minutes?


323

Quelle est la façon la plus élégante d'obtenir une présentation formatée ISO 8601 du moment actuel, UTC? Il devrait ressembler à : 2010-10-12T08:50Z.

Exemple:

String iso8601 = DateFormat.getDateTimeInstance(DateFormat.ISO_8601).format(date);


5
@marcolopes Attention, l'utilisation de a private static SimpleDateFormatn'est pas sécurisée pour les threads.
vegemite4me


Similaire à cette autre Question , mais celle-ci tronque à la seconde entière alors que cette Question tronque à la minute entière.
Basil Bourque

Réponses:


292

Utilisez SimpleDateFormatpour formater n'importe quel Dateobjet que vous souhaitez:

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());

L'utilisation d'un new Date()comme indiqué ci-dessus formatera l'heure actuelle.


8
@Joachim Le côté négatif de cette approche "standard" est que je dois avoir de nombreuses instances de "yyyy-MM-dd'T'HH:mmZ"dans ma demande, chaque fois que j'ai besoin d'une date au format ISO-8601. Avec JodaTime, comme je vois, je peux utiliser un formateur prédéfini ISODateTimeFormat, qui fait ce travail pour moi ..
yegor256

8
@Joachim, Zest le modèle valable dans SimpleDateFormat plutôt faire: yyyy-MM-dd'T'HH:mm'Z'.
Buhake Sindi

33
-1 Cela vous donne la date / heure dans le fuseau horaire actuel - pas UTC. La réponse de Carlos comprend le code UTC nécessaire.
Scott Rippey

16
Je viens de corriger l'erreur de fuseau horaire - puisque c'est la réponse acceptée, je pense que c'était la bonne chose à faire.
BoD

2
Le Z doit être cité comme "aaaa-MM-jj'T'HH: mm'Z '"
Kimball Robinson

224

Pour les systèmes où le fuseau horaire par défaut n'est pas 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());

le SimpleDateFormat instance peut être déclarée comme une constante globale si nécessaire fréquemment, mais sachez que cette classe n'est pas thread-safe. Il doit être synchronisé s'il est accessible simultanément par plusieurs threads.

EDIT: Je préférerais Joda Time si vous faites de nombreuses manipulations différentes de Time / Date ...
EDIT2: corrigé: setTimeZonen'accepte pas de chaîne (corrigé par Paul)


9
Ce format n'est pas une constante n'importe où dans une bibliothèque intégrée?
Daniel Kaplan

Il existe deux packages différents pour 'DateFormat', n'oubliez pas d'utiliser 'import java.text.DateFormat'
oabarca

3
Si vous voulez le fuseau horaire actuel, utilisez TimeZone tz = TimeZone.getDefault (); à la place
oabarca

Vous ne devez pas citer le «Z» dans le format car cela le rend logiquement insignifiant. Si la TimeZone est UTC comme dans l'exemple ci-dessus, alors un Z sans guillemets n'entraînera qu'un Z dans la sortie ... cependant si la TimeZone n'est pas UTC, alors le Z sera toujours affiché comme un littéral impliquant UTC lorsque l'heure ne peut pas être. Si un système consommateur lit le Z comme UTC mais l'heure n'est pas l'heure sera décalée. Inversement, si un analyseur utilise le Z entre guillemets sans définir la zone horaire, il analysera les heures UTC en tant qu'heures locales (à nouveau décalées). Cette citation n'est pas nécessaire si le TZ est défini mais est dangereuse si ce n'est pas le cas.
Matt Whipple

@MattWhipple - mais si vous utilisez un Z sans guillemets, le résultat sera quelque chose comme 2016-06-14T13:56+0000- la question demande quelque chose comme2016-06-14T13:56Z
user85421

184

Java 8 natif

java.time le rend simple depuis Java 8. Et thread-safe.

ZonedDateTime.now( ZoneOffset.UTC ).format( DateTimeFormatter.ISO_INSTANT )

Résultat: 2015-04-14T11:07:36.639Z

Vous pouvez être tenté d'utiliser des briquets Temporaltels que Instantou LocalDateTime, mais ils manquent de support du formateur ou de données de fuseau horaire. Fonctionne uniquement ZonedDateTimehors de la boîte.

En réglant ou en chaînant les options / opérations de ZonedDateTime et DateTimeFormatter , vous pouvez facilement contrôler le fuseau horaire et la précision , dans une certaine mesure:

ZonedDateTime.now( ZoneId.of( "Europe/Paris" ) )
             .truncatedTo( ChronoUnit.MINUTES )
             .format( DateTimeFormatter.ISO_DATE_TIME )

Résultat: 2015-04-14T11:07:00+01:00[Europe/Paris]

Les exigences raffinées, telles que la suppression de la partie secondes, doivent toujours être satisfaites par des formats personnalisés ou un post-traitement personnalisé.

.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

Pour Java 6 et 7, vous pouvez envisager des ports arrière de java.time tels que ThreeTen-Backport , qui dispose également d'un port Android . Les deux sont plus légers que Joda et ont appris de l' expérience de Joda - esp. étant donné que java.time est conçu par l'auteur de Joda.


9
Bonne réponse. Notez la bonne habitude de spécifier explicitement un fuseau horaire plutôt que de vous fier implicitement au fuseau horaire par défaut actuel de la JVM. Vous pouvez spécifier un fuseau horaire particulier si vous le souhaitez, comme ZoneId.of( "America/Montreal" ).
Basil Bourque

1
Instant permet de le formater au format ISO 8601 en appelant simplement la méthode .toString ():return DateTimeFormatter.ISO_INSTANT.format(this);
VadymVL

C'est mieux car vous évitez la valeur par défaut.
Christophe Roussy

6
Avertissement: La solution pour Java 8 utilisant ISO_INSTANT a une bizarrerie ennuyeuse. Lorsque les millisecondes se trouvent à 0, elles ne sont pas incluses dans la sortie. Ceci est autorisé selon la norme ISO 8601 mais de nombreuses bibliothèques et analyseurs dans d'autres langues ne sont pas si tolérants. S'il est nécessaire de toujours inclure les zéros, utilisez-le à la place: DateTimeFormatter ISO_8601 = ofPattern ("aaaa-MM-jj'T'HH: mm: ss.SSSX"). WithZone (UTC);
jurgen

Après être passé de Java 8 à 11, je vois DateTimeFormatter.ISO_INSTANTet j'utilise DateTimeFormatter.ISO_DATE_TIME6 chiffres après les secondes, par opposition à 3, qui n'est plus repris par Spring's @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME).
DanielM

126

Java 8:

thisMoment = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mmX")
                              .withZone(ZoneOffset.UTC)
                              .format(Instant.now());

Pré Java 8:

thisMoment = String.format("%tFT%<tRZ",
                           Calendar.getInstance(TimeZone.getTimeZone("Z")));

De la documentation :

'R'    Heure au format 24 heures sur "% tH:% tM"
'F'    Date complète ISO 8601 au format "% tY-% tm-% td".


26
Eh bien, soit vous incluez une bibliothèque tierce supplémentaire en tant que dépendance à votre projet (que vous voudrez peut-être tenir à jour et livrée avec votre application, hé, c'est juste un supplément de 3,2 mégaoctets) et le faites DateTime dt = new DateTime(); DateTimeFormatter fmt = ISODateTimeFormat.dateTime(); String str = fmt.print(dt);, ou vous encapsulez return String.format("%tFT%<tRZ", new Date());dans une classe, et faites str = Iso8601Time.now(), partout où vous en avez besoin. (Ce n'est pas comme si le format ISO allait changer.) S'il s'avère que vous avez besoin de plus que la date actuelle au format ISO, utilisez une lib.
aioobe

2
Tout à fait d'accord avec cela.
yegor256

3
Notez qu'il est possible de changer quelle réponse est marquée comme acceptée ;-)
aioobe

8
%tFT%<tTZcomprendra des secondes; %tFT%<tTZ.%<tLcomprendra des millisecondes.
Patrick Linskey

2
Une solution très soignée, devrait être la réponse acceptée maintenant :)
AbdelHady

94

Depuis Java 8, vous pouvez simplement faire:

Instant.now().toString();

De la java.time.Instantdocumentation:

maintenant

public static Instant now()

Obtient l'instant actuel de l'horloge système.

Cela interrogera l' horloge UTC du système pour obtenir l'instant actuel.

 


public String toString()

Une représentation sous forme de chaîne de cet instant utilisant la représentation ISO-8601.

Le format utilisé est le même que DateTimeFormatter.ISO_INSTANT.


11
C'est la bonne réponse, et c'est un scandale qu'elle n'ait pas été votée plus haut sur tous ces concoctés SimpleDateFormats.
David Moles

Heureux d'avoir lu plus de réponses. Je suis d'accord, cela devrait être la réponse maintenant.
Xan-Kun Clark-Davis

Et parce que c'est le cas toString, dans de nombreux cas, vous n'aurez même pas besoin de l'appeler explicitement.
kaya3

1
L'avertissement dans un commentaire sur une réponse précédente s'applique ici aussi: "Avertissement: La solution pour Java 8 utilisant ISO_INSTANT a une bizarrerie ennuyeuse. Lorsque les millisecondes se trouvent être 0, elles ne sont pas incluses dans la sortie. Ceci est autorisé selon l'ISO 8601. standard mais de nombreuses bibliothèques et analyseurs dans d'autres langues ne sont pas si indulgents. "
Dave L.

27

utiliser JodaTime

Le système de calendrier ISO 8601 est l'implémentation par défaut dans Joda-Time

Voici le doc pour JodaTime Formatter

Éditer:

Si vous ne voulez pas ajouter ou si vous ne voyez pas la valeur de l'ajout de la bibliothèque ci-dessus, vous pouvez simplement l'utiliser dans la SimpleDateFormatclasse intégrée pour formater la date au format ISO requis

comme suggéré par @Joachim Sauer

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");
String nowAsString = df.format(new Date());

3
Et comment produiriez-vous une chaîne formatée comme indiqué dans la question?
Joachim Sauer

4
Je dirais que vous n'ajoutez pas de dépendance de bibliothèque pour quelque chose d'aussi simple que cela (ce qui peut être réalisé avec deux lignes de code java). (Bien sûr, si les exigences augmentent, c'est une autre histoire.)
aioobe

1
@aioobe, si c'est juste utilisé dans plusieurs parties de l'application, alors c'est ok pour aller par défaut, dans le cas où le jodatime est mieux.
Jigar Joshi

5
@aioobe jodatime est meilleur dans tous les cas, car il a ISODateTimeFormat- un formateur prédéfini d'ISO-8601.
yegor256

3
@ org.life.java: qui ne sont pertinents que lorsque vous pouvez passer correctement à l'heure Jode. Vous ne les aurez pas lorsque vous n'utiliserez que cette fonction du temps Joda.
Joachim Sauer du

20

DateFormatUtils d'Apache commons-lang3ont des constantes utiles, par exemple:DateFormatUtils.ISO_DATETIME_FORMAT


3
Plus précisément, le moment actuel UTC: DateFormatUtils.format(new Date(), "yyyy-MM-dd'T'HH:mm'Z'", TimeZone.getTimeZone("UTC"));moment présent dans la zone de temps par défaut: DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(new Date()); @ yegor256 merci d'avoir mentionné DateFormatUtils, ayant à bord apache commons-lang, il vaut la peine d'utiliser le format de date.
babinik

19

Si vous ne voulez pas inclure Jodatime (aussi agréable soit-il)

javax.xml.bind.DatatypeConverter.printDateTime(
    Calendar.getInstance(TimeZone.getTimeZone("UTC"))
);

qui renvoie une chaîne de:

2012-07-10T16:02:48.440Z

qui est légèrement différente de la demande d'origine mais qui est toujours ISO-8601.



10

Joda-Time

Mise à jour: Le projet Joda-Time est maintenant en mode maintenance , l'équipe conseillant la migration vers les classes java.time . Pour Java 6 et 7, voir le projet ThreeTen-Backport , encore adapté pour Android dans le projet ThreeTenABP .

Utilisation de la bibliothèque Joda-Time

String output = new DateTime( DateTimeZone.UTC ).toString() ;

C'est thread-safe. Joda-Time crée de nouveaux objets immuables plutôt que de modifier des objets existants.

Si vous aviez vraiment l'intention de demander un format sans secondes, en résolvant en minutes, alors utilisez l'un des nombreux autres formateurs intégrés dans Joda-Time.

DateTime now = new DateTime( DateTimeZone.UTC ) ;
String output = ISODateTimeFormat.dateHourMinute.print( now ) ;

java.time

Pour Java 8 et versions ultérieures, Joda-Time continue de fonctionner. Mais le framework java.time intégré remplace Joda-Time. Migrez donc votre code de Joda-Time vers java.time dès que cela vous convient.

Voir mon autre réponse pour une solution moderne.


À propos de java.time

Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciens gênants hérités des classes date-heure tels que java.util.Date, Calendar, et SimpleDateFormat.

Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers les classes java.time .

Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .

Vous pouvez échanger des objets java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure. Pas besoin de chaînes, pas besoin de java.sql.*cours.

Où obtenir les classes java.time?

  • Java SE 8 , Java SE 9 , Java SE 10 et versions ultérieures
    • Intégré.
    • Une partie de l'API Java standard avec une implémentation groupée.
    • Java 9 ajoute quelques fonctionnalités et correctifs mineurs.
  • Java SE 6 et Java SE 7
    • Une grande partie de la fonctionnalité java.time est rétroportée vers Java 6 et 7 dans ThreeTen-Backport .
  • Android
    • Versions ultérieures des implémentations de bundles Android des classes java.time.
    • Pour les versions antérieures d'Android (<26), le projet ThreeTenABP adapte ThreeTen-Backport (mentionné ci-dessus). Voir Comment utiliser ThreeTenABP… .

Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour de futurs ajouts possibles à java.time. Vous trouverez peut - être des classes utiles ici, comme Interval, YearWeek, YearQuarteret plus .


7

Pour Java version 7

Vous pouvez suivre la documentation Oracle: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

X - est utilisé pour le fuseau horaire 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);

5

Vous pouvez utiliser SimpleDateFormat de Java avec le modèle suivant yyyy-MM-dd'T'HH:mm:ssXXXpour ISO 8601.

Exemple de code: (répertorie tous les fuseaux horaires 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();
}

Vous pouvez utiliser:

TimeZone.getDefault ()

pour le fuseau horaire vm par défaut. Plus ici

Vous remarquerez peut-être l'heure de la date pour quelques fuseaux horaires se terminant par 'Z'. Ces fuseaux horaires ont décalé de '0'GMT.

Plus d'informations peuvent être trouvées ici .


5

Je pense que la façon la plus simple est de passer d'abord à l'instant, puis à la chaîne comme:

String d = new Date().toInstant().toString();

Ce qui se traduira par:

2017-09-08T12:56:45.331Z


4
Si vous voulez l'heure actuelle, il n'est pas nécessaire de passer par un Dateobjet à l' ancienne . Faites-le Instant.now().toString(). Si vous avez obtenu une DateAPI héritée, votre méthode est la meilleure.
Ole VV

Comme l'a commenté Ole VV, les anciennes classes de date-heure gênantes telles que java.util.Date, java.util.Calendaret java.text.SimpleDateFormatsont désormais héritées , supplantées par les classes java.time intégrées à Java 8 et versions ultérieures. Voir Tutoriel par Oracle .
Basil Bourque

5

tl; dr

Certaines des autres réponses sont correctes en recommandant les classes java.time , mais essayez d'utiliser des longueurs inutiles pour vos besoins spécifiques.

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 jav.time.Instantclasse représente un moment en UTC, toujours en UTC.

Instant instant = Instant.now() ;

instant.toString (): 2018-01-23T12: 34: 56.123456Z

La Zfin de votre exemple de chaîne 2010-10-12T08:50Zse prononce «Zulu» et signifie UTC .

Le format souhaité se trouve être conforme à la norme ISO 8601 . Les classes java.time utilisent ces formats standard par défaut lors de l'analyse / génération de chaînes. Il n'est donc pas nécessaire de spécifier un modèle de formatage. Appelez simplement Instant::toStringcomme vu ci-dessus.

Si vous voulez spécifiquement des minutes entières sans seconde ou fraction de seconde, tronquez. Spécifiez une unité de temps via la ChronoUnitclasse.

Instant instant = Instant.now().truncatedTo( ChronoUnit.MINUTES ) ;
String output = instant.toString();  // Generate a `String` object in standard ISO 8601 format.

À propos de java.time

Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciens gênants hérités des classes date-heure tels que java.util.Date, Calendar, et SimpleDateFormat.

Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers les classes java.time .

Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .

Vous pouvez échanger des objets java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure. Pas besoin de chaînes, pas besoin de java.sql.*cours.

Où obtenir les classes java.time?

  • Java SE 8 , Java SE 9 , Java SE 10 et versions ultérieures
    • Intégré.
    • Une partie de l'API Java standard avec une implémentation groupée.
    • Java 9 ajoute quelques fonctionnalités et correctifs mineurs.
  • Java SE 6 et Java SE 7
    • Une grande partie de la fonctionnalité java.time est rétroportée vers Java 6 et 7 dans ThreeTen-Backport .
  • Android
    • Versions ultérieures des implémentations de bundles Android des classes java.time.
    • Pour les versions antérieures d'Android (<26), le projet ThreeTenABP adapte ThreeTen-Backport (mentionné ci-dessus). Voir Comment utiliser ThreeTenABP… .

Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour de futurs ajouts possibles à java.time. Vous trouverez peut - être des classes utiles ici, comme Interval, YearWeek, YearQuarteret plus .


2

Voici une classe entière optimisée pour que l'invocation de "now ()" ne fasse rien de plus que cela.

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());
    }
}

9
Le rendre statique peut causer des problèmes car SimpleDateFormat n'est pas sûr pour les threads: "Les formats de date ne sont pas synchronisés. Il est recommandé de créer des instances de format distinctes pour chaque thread. Si plusieurs threads accèdent simultanément à un format, il doit être synchronisé en externe." docs.oracle.com/javase/7/docs/api/java/text/…
Juha Palomäki

2
Comme @Juha Palomäki l'a mentionné, ce n'est pas threadsafe. Si vous utilisez Java 8 ou supérieur, ThreadLocal.withInitial peut résoudre ce problème. Si vous utilisez Java 7 ou une version antérieure, créez un nouveau ThreadLocal et fournissez une valeur initiale en remplaçant ThreadLocal.initialValue
user393274

@ user393274 - si vous utilisez Java 8, vous devez utiliser Instant, DateTimeFormatet les autres remplacements modernes de thread-safe

Je suis un peu perplexe quant au problème avec SimpleDateFormat qui n'est pas sûr pour les threads. Si deux threads exécutent l'initialiseur statique en même temps, je ne vois rien de pire se produire que le constructeur SimpleDateFormat soit appelé deux fois mais un seul instant (le dernier à terminer) est enregistré comme "df".
gilbertpilz

2
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());
}

1

Néanmoins, joda-time ne prend en charge que le format étendu: "2015-12-09T00: 22: 42.930Z" et non pas le format de base: "20151209T002242.930Z" ... il vaudrait peut-être mieux tester une liste de formats avec java SimpleDateFormat.


1

Je l'ai fait dans Android en utilisant Calendar et SimpleDateFormat. La méthode suivante renvoie un calendrier avec le fuseau horaire "GMT" (il s'agit du fuseau horaire universel). Ensuite, vous pouvez utiliser la classe Calendar pour définir l'heure entre les différents fuseaux horaires, en utilisant la méthode setTimeZone () de la classe Calendar.

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;
}

N'OUBLIEZ PAS: la classe Date ne connaît pas l'existence de TimeZone. Pour cette raison, si vous déboguez une date, vous voyez toujours la date de votre fuseau horaire actuel.


1

Si vous vous souciez des performances, j'ai créé une bibliothèque qui surpasse l'analyseur et le formateur Java standard en matière de manipulation avec des dates au format ISO8601. Les implémentations DatetimeProcessor sont thread-safe et peuvent être mises en cache dans une carte simultanée ou des champs statiques.

<dependency>
  <groupId>com.axibase</groupId>
  <artifactId>date-processor</artifactId>
  <version>1.0.3</version>
</dependency>
import com.axibase.date.DatetimeProcessor;
import com.axibase.date.PatternResolver;
import org.junit.Before;
import org.junit.Test;

import java.time.Clock;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZoneOffset;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;

public class DateFormatTest {
    private Clock clock;

    @Before
    public void prepare() {
        clock = Clock.fixed(Instant.ofEpochMilli(1571285405300L), ZoneId.of("Europe/Berlin"));
    }

    @Test
    public void testIsoMillis(){
        final DatetimeProcessor formatter = PatternResolver.createNewFormatter("iso");
        assertThat(formatter.print(clock.millis(), ZoneOffset.UTC), is("2019-10-17T04:10:05.300Z"));
    }

    @Test
    public void testIsoMillisLocalZone(){
        final DatetimeProcessor formatter = PatternResolver.createNewFormatter("iso");
        assertThat(formatter.print(clock.millis(), clock.getZone()), is("2019-10-17T06:10:05.300+02:00"));
    }

    @Test
    public void testIsoMinutes(){
        final DatetimeProcessor formatter = PatternResolver.createNewFormatter("yyyy-MM-ddTHH:mmXXX");
        assertThat(formatter.print(clock.millis(), ZoneOffset.UTC), is("2019-10-17T04:10Z"));
    }
}

0

Ils auraient dû ajouter un moyen simple de passer de la date à l'instantané et également une méthode appelée toISO8601, ce que beaucoup de gens recherchent. En complément d'autres réponses, du format java.util.Date au format ISO 8601:

Instant.ofEpochMilli(date.getTime()).toString();

Il n'est pas vraiment visible lors de l'utilisation de l'auto-complétion mais java.time.Instant.toString():

Une représentation sous forme de chaîne de cet instant en utilisant ISO-8601


0
DateTimeFormatter.ISO_DATE_TIME
        .withZone(ZoneOffset.UTC)
        .format(yourDateObject.toInstant())

Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire concernant pourquoi et / ou comment ce code répond à la question améliore sa valeur à long terme.
Vishal Chhodwani

-2

Essaye ça,

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ");
        String date=sdf.format (new Date() );

Son format ISO 8601


2
Cela utiliserait des dates dans le mauvais fuseau horaire, voir la réponse de Carlos.
Stian Soiland-Reyes
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.