Si no ens agrada, primer em d'entendre que passa. Si per exemple programem en C# i utilitzem el les llibreries de MongoDB per C#, quan volem emmagatzemar una data farem alguna cosa semblat al següent.
BsonDocument par = new BsonDocument(); par.Add("scope", new BsonString(scope)); par.Add("client_app", new BsonString(appName)); par.Add("client_machine", new BsonString(computerName)); par.Add("userName", new BsonString(userName)); par.Add("dateTime", new BsonDateTime(when)); par.Add("exception", BsonDocument.Parse(jsonException));
On "when" és una variable DateTime amb format Local. Però si mirem a la BD, quan queda enregistrada, està el valor Utc. Perquè? Doncs perque MongoDB treballa amb dates Utc. I com ho fa? doncs la classe BsonDateTime interroga la propietat Kind de la data, i si veu que es Local, agafa el valor Utc i l'emagatzema. (when.ToUniversalTime()). Això ho fa sempre al serialitzar una data. I quan llegim de la BD en una aplicació i la deserialitza, agafa la data i la converteix en local.
Correcte!!!, però i si volem veure les dades correctament des del MongoVUE? Com ho fem?? Doncs l'enganyem!! Com? Molt fàcil, modificant el Kind de la data, dient-li que la nostre data ja és universal.
DateTime _when = DateTime.SpecifyKind(when, DateTimeKind.Utc);
i emmagatzemem aquesta.
par.Add("dateTime", new BsonDateTime(_when));
Però cuidado ara al llegir des d'una aplicació, ell automàticament ens la passarà a local, i per tant no ens donarà el valor correcte. Per tant hem de fer el procés invers.
Ara en VB.Net:
Dim _databona As Date = Date.SpecifyKind(_datamongo, DateTimeKind.Local).ToUniversalTime
I això es tot. I amb això mirem on mirem els valors emmagatzemats, sempre veurem una data local.
Cap comentari:
Publica un comentari a l'entrada