web-dev-qa-db-fra.com

Comment gagner la date correctement?

J'essaye de gagner la date (en utilisant le pilote officiel C #):

val = DateTime.Parse(value).Date; //Here date is {11/11/2011 12:00:00 AM}
var update = Update.Set("Date", val);
...

Lorsque je sélectionne Date dans la base de données, la valeur est {11/10/2011 22:00:00}.

Comment ne sauvegarder que la date que je veux?

24
1gn1ter

pilote c # par défaut (sans paramètres supplémentaires), en enregistrant les dates locales en tant que date utc dans la base de données (décalage date-fuseau horaire), mais en les relisant sans action (donc, date utc).

De ce fait, lorsque vous chargez datetime depuis une base de données, vous recevez un différentiel en 2 heures (décalage de votre fuseau horaire). Il existe deux approches pour dire à mongodb c # que le pilote convertit les dates utc en dates de fuseau horaire local pendant la désérialisation:

1. via les attributs pour un champ de date particulier:

[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime SomeDateProperty {get;set;}

2. Paramètres globaux pour tous les champs datetime (la valeur par défaut est UtcInstance):

DateTimeSerializationOptions.Defaults = DateTimeSerializationOptions.LocalInstance;

Une fois que vous ferez le n ° 1 ou le n ° 2, vous verrez la date locale.

Mettre à jour:


# 2 est obsolète dans la dernière version du pilote, utilisez donc le code ci-dessous:

BsonSerializer.RegisterSerializer(typeof(DateTime), 
             new DateTimeSerializer(DateTimeSerializationOptions.LocalInstance));

Mettre à jour:


Le n ° 2 a encore changé:

BsonSerializer.RegisterSerializer(typeof(DateTime), DateTimeSerializer.LocalInstance);
42
Andrew Orsich

Vous rencontrez un problème de fuseau horaire. Votre objet de date est probablement dans un fuseau horaire autre que UTC (2 heures à l’avance), ou votre fuseau horaire par défaut est défini sur autre chose que UTC. Le pilote convertira la date dans le fuseau horaire approprié avant de la stocker dans la base de données.

Normalement, vous ne le remarqueriez pas puisque l’inverse (récupérer la date UTC de la base de données) devrait la reconvertir dans le fuseau horaire d’origine. Le pilote que vous utilisez peut-être un problème ou C # peut nécessiter un peu plus de code pour le faire correctement.

Stocker des dates en tant que chaînes n'est généralement pas une bonne idée car il désactive les requêtes de plage sur les dates.

2
Remon van Vliet

Mongo stocke tout le contenu en UTC, si votre heure de date est UTC, cela vous aidera

val = DateTime.SpecifyKind(val , DateTimeKind.Utc);
var update = Update.Set("Date", val);
1
Brijesh Mishra

Le 2.2.4.26 a encore changé:

BsonSerializer.RegisterSerializer(typeof(DateTime), DateTimeSerializer.LocalInstance);
1
yongfa365