2011-07-13 4 views
1

J'ai différents horodatages stockés dans les collections Mongo, certains comme des flottants et d'autres comme des ints.Convertir les horodatages stockés dans une collection Mongo

Ils sont tous stockés dans BST et le serveur passera bientôt à l'UTC. Comment les convertir dans Mongo pour être des horodatages UTC?

MySQL Je peux le faire:

UPDATE `table` SET `field` = CONVERT_TZ(`field`, 'Europe/London', 'UTC'); 

Y at-il un équivalent Mongo?

Répondre

1

Vous devrez utiliser la langue de votre choix et les mettre à jour une à la fois. Il devrait être aussi simple qu'une boucle for qui charge les données et les réécrit.

Vérifiez simplement la façon dont votre langue de choix traite les horodatages dans les fuseaux horaires. Faire un tel changement de données peut avoir toutes sortes d'effets inattendus sur le code de production.

-1

Quelques points à prendre en considération au sujet de la date à Mongo:

  • Toutes les dates sont stockées en UTC dans MongoDB
  • magasins MongoDB dates en interne comme un entier de 64 bits représentant millisecondes depuis 1970-01-01T00: 00 : 00Z
  • Si la valeur de date que vous fournissez ne sont pas déjà en UTC, il sera converti en UTC avant d'être stockées dans MongoDB par le conducteur

La recommandation est de ne pas utiliser DateTime.Parse. Vous rencontrerez tous les problèmes de fuseau horaire concernant le formatage des DateTimes. Au lieu de cela, utilisez simplement l'un des constructeurs DateTime avec la saveur UTC.

Exemple:

var dateTime = new DateTime(2011, 5, 5, 0, 0, 0, DateTimeKind.Utc); 

espère que vous trouverez utile.

+0

Il ne stocke pas ses dates en tant qu'objets 'Date', mais en tant qu'ints et flottants. – Theo

+0

Aussi, pourquoi supposez-vous qu'il utilise C#? En regardant d'autres questions, il est demandé qu'ils sont principalement sur PHP. – Theo

-1

Les horodatages sont généralement en UTC et non dans un fuseau horaire spécifique. Toutes les bibliothèques de date/heure avec lesquelles j'ai travaillé retournent des horodatages correspondant au nombre de secondes (ou de millisecondes) écoulées depuis le 1er janvier 1970 UTC. Consultez la documentation de la bibliothèque que vous avez utilisée pour créer l'horodatage pour être sûr. Cela signifie que tout devrait bien se passer, sauf si vous avez utilisé une bibliothèque date/heure qui ne respecte pas cette convention, ou calculé d'une manière ou d'une autre les horodatages vous-même et comptabilisé le fuseau horaire. Par exemple, en JavaScript, si vous stockez la valeur renvoyée par new Date().getTime() et que vous la transmettez ensuite à new Date(...) sur un autre système, vous obtiendrez la même date/heure absolue, quel que soit le fuseau horaire des deux systèmes. La même chose vaut pour Ruby, faire Time.new.to_i sur une machine, et exécuter Time.at(...) sur un autre et vous obtiendrez la même date/heure absolue. Quand je dis «date/heure absolue», je veux dire que c'est l'heure UTC qui sera la même, très probablement le système l'affichera dans le fuseau horaire local, mais c'est ce que vous voulez.

Questions connexes