web-dev-qa-db-fra.com

Comment envoyer Java.util.Date dans Json?

J'ai besoin d'envoyer des données dans json . Ce qui est important, c’est que je souhaite que les paramètres régionaux soient préservés afin que le destinataire reçoive la date à son heure locale. Comment puis je faire ça?

Je ne peux pas simplement utiliser Date.toString() car je ne pourrai pas le ré-analyser à la date de réception si leurs paramètres régionaux sont différents (noms de jour et de mois différents, etc.).

Y a-t-il une solution à cela?

8
Greyshack

Utilisez la méthode getTime de Java.util.Date pour l'horodatage. Une fois que vous l'avez reconverti en date, chaque destinataire peut l'afficher en utilisant son fuseau horaire local.

Rappelez-vous cette date 

représente un instant spécifique dans le temps, avec une précision d'une milliseconde.

La méthode toString le formate simplement de manière spécifique à :

dow mon dd hh:mm:ss zzz yyyy

Choisir d'envoyer l'horodatage signifie que vous utilisez également moins de bande passante.

3
Laurentiu L.

Un long moment depuis 1970 est acceptable, mais pas lisible par l’homme, et donc un PITA pour les tests/développement.

Par conséquent, utilisez ISO 8601 heure de date standard"yyyy-MM-dd'T'HH:mm:ss" (où 'T' est juste une valeur littérale T (on voit souvent un espace ici; et des secondes fractionnelles .SSS).

L'heure zone est également possible, mais heureusement non nécessaire (= incorporé dans l'heure localisée).

Avant Java 8, utilisez SimpleDateFormat.

6
Joop Eggen

tl; dr

Instant.now()
       .toString()

2017-01-23T12: 34: 56.123456789Z

UTC

Il est généralement préférable d’échanger des données pour les valeurs date-heure en UTC (GMT). Laissez le récepteur s’ajuster sur le fuseau horaire souhaité.

Instant

La classe Instant représente un moment sur la ligne de temps en temps UTC avec une résolution en nanosecondes. 

Instant instant = Instant.now() ;
String output = instant.toString() ;  // Generate a String in standard ISO 8601 format.

2017-01-23T12: 34: 56.123456789Z

Vous pouvez facilement analyser cette chaîne.

Instant instant = Instant.parse( "2017-01-23T12:34:56.123456789Z" ) ; 

ISO 8601

La norme ISO 8601 définit des formats clairs, faciles à lire et à analyser, pour les représentations textuelles de valeurs date-heure. Ces formats sont idéaux pour l’échange de données.

Pendant un instant en UTC, cela correspond au format présenté dans l'exemple ci-dessus. La T sépare la partie date du moment de la journée. Z à la fin est l'abréviation de Zulu et signifie UTC. 

Lieu

La question mentionne les paramètres régionaux comme s'ils étaient liés au fuseau horaire. Un Locale _ n'a rien à voir avec le fuseau horaire. Un Locale spécifie (a) la langue humaine pour la traduction du nom du jour, du nom du mois, etc., et (b) les normes culturelles déterminant les questions d'abréviation, de majuscule, de ponctuation, etc.

Un fuseau horaire est un historique des modifications apportées à la zone décalage par rapport à UTC , suivi des anomalies provoquant ces modifications, tel que Heure avancée }. 

Recherchez Stack Overflow pour en savoir plus. Cela a déjà été couvert plusieurs centaines de fois. Recherchez des classes telles que ZoneId, ZoneOffset, ZonedDateTime, Instant, OffsetDateTime et DateTimeFormatter. Lisez le tutoriel Oracle sur les classes Java.time. 

ZonedDateTime zdt = instant.atZone( ZoneId.of( "Pacific/Auckland" ) ) ;

À propos de Java.time

Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes gênantes héritées _ date-heure telles que Java.util.Date , Calendar _, & SimpleDateFormat .

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

Pour en savoir plus, consultez le Oracle Tutorial . 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 une version ultérieure. Pas besoin de chaînes, pas besoin de Java.sql.* classes.

Où obtenir les classes Java.time? 

Le projet ThreeTen-Extra étend Java.time avec des classes supplémentaires. Ce projet est un terrain d’essai pour d’éventuels ajouts à Java.time. Vous pouvez y trouver des classes utiles telles que Interval _, YearWeek , YearQuarter _ et plus _.

4
Basil Bourque

Pour ce faire, écrivez votre date au format ISO 8601: I.e. 2015-08-03T4:50:49+00:00

Non seulement le fuseau horaire sera inclus, mais tout décodeur standard à la réception de votre JSON sera capable de le décoder sans problème.

Pour la partie envoi, si vous écrivez vous-même la chaîne, formatez-la simplement:

ZonedDateTime.now( ZoneId.systemDefault() )
             .format( DateTimeFormatter.ISO_DATE_TIME )

Mais si vous utilisez des sérialiseurs JSON pour transformer vos objets Java (comme Jackson par exemple), il suffit de définir l'attribut d'objet en Java.util.Date et le sérialiseur doit savoir quoi faire, avec la bonne configuration. Voir cette réponse pour Jackson, ou celle-ci pour Jersey. Ils utilisent tous les deux Joda Time.

2
mprivat

Je pense qu'il y a un moyen simple de le faire,

DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
yourJsonObject.accumulate("yourDateVarible",dateFormat.format(new Date()));
1
SwapnilKumbhar

Il y a plusieurs façons de le faire. Une façon de convertir une date en millisecondes qui ne dépend pas de la localisation et de l’utiliser plus loin . Une autre façon de changer une date au format utc et de l’utiliser plus tard. Si le fuseau horaire de votre serveur est défini sur UTC Java.util.Date fonctionnera parfaitement, car le système prend par défaut le fuseau horaire des systèmes lors de l’utilisation de la nouvelle date ("une date"). Exemple:

   long lastAccessedDate =  110002028250;
  String myDate = new Java.util.Date(lastAccessedDate()).toString();

myDate sera "Tue Jun 06 05:30:00 UTC 2017", si le fuseau horaire du système est UTC.

0
abhishek ringsia