La disposition par défaut de Golang JSON varie selon la plate-forme?

Je suis time.Time un problème étrange, à savoir que la chaîne de caractères JSON a été encodée dans le temps. Le time.Time varie entre mon environnement de développement (OSX) et mon environnement de production (Ubuntu 14.04 x64).

 type Thang struct { CreatedAt time.Time `json:"created_at"` } 

OSX:

 { // RFC3339 layout created_at: "2015-04-24T22:39:59Z", } 

Ubuntu 14.04 x64:

 { // RFC3339Nano layout created_at: "2015-05-21T15:00:46.546000003Z", } 

J’ai googlé autour pour toujours. Impossible de trouver celui-là. Voici quelques infos supplémentaires:

  • C’est une application de services Web simple
  • Lancer la version go 1.4.1 sur ma machine OSX
  • Je comstack l’application sur ma machine OSX pour un déploiement comme celui-ci:
    • GOOS=linux GOARCH=amd64 go build

J’apprécierais n’importe quel aperçu!

La source de time.Time est:

 // MarshalJSON implements the json.Marshaler interface. // The time is a quoted ssortingng in RFC 3339 format, with sub-second precision added if present. func (t Time) MarshalJSON() ([]byte, error) { if y := t.Year(); y < 0 || y >= 10000 { // RFC 3339 is clear that years are 4 digits exactly. // See golang.org/issue/4556#c15 for more discussion. return nil, errors.New("Time.MarshalJSON: year outside of range [0,9999]") } return []byte(t.Format(`"` + RFC3339Nano + `"`)), nil } 

[ source time.MarshalJSON sur GitHub ]

et est la même sur toutes les plates-formes. Remarque:

[…] avec une précision inférieure à la seconde si présente.

Et que RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00" . Les “9” signifient utiliser jusqu’à plusieurs chiffres, mais supprimer les zéros à la fin. Il semble donc que vos deux exemples puissent correspondre à ce format. (Et quand on parsing les temps, Go accepte et parsing toujours les fractions de fraction, peu importe ce que dit le format).

La section 5.6 de la RFC3339 spécifie que les secondes fractionnaires sont facultatives et peuvent ou non être incluses (en disant seulement que si le point décimal est présent, il doit être suivi d’au moins un chiffre).

Pour une raison quelconque, le temps que vous utilisez sur un seul système n’a-t-il qu’une deuxième précision ou une autre? (par exemple, cela vient-il d’un système de fichiers ou d’un autre sous-système qui ne stocke que des secondes sur l’un des systèmes d’exploitation?).

RFC3339 ne dit rien sur la précision du temps. Il semblerait qu’Ubuntu insiste pour append neuf autres chiffres décimaux de précision, ce qui est bien selon la RFC3339.

Sur iOS / MacOS X, le même parsingur de format de date ne peut pas parsingr les secondes avec et sans point décimal, donc j’utilise deux formats

 "yyyy'-'MM'-'dd'T'HH':'mm':'ssX5" "yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSSSSSSSSX5" 

et essayez les deux. (En fait, j’avais six caractères S parce que je pensais que personne ne jugerait plus de six décimales. C’était faux).

Je pense que les formats de date dans iOS / MacOS X sont normalisés par la norme Unicode, de sorte que cela pourrait également s’appliquer à d’autres parsingurs. Pour des raisons d’efficacité, je me rappellerais quel parsingur a fonctionné la dernière fois et l’essayer d’abord – si vous avez une date avec des nanosecondes, alors la prochaine date aura probablement aussi des nanosecondes.