2013-06-03 5 views
9

मेरे पास एक मोंगो सी # कार्यान्वयन है जो यूटीसी के रूप में डेटाटाइम स्टोर करता है।मोंगो में यूटीसी और स्थानीय डेटाटाइम स्टोर करना

MongoDB.Bson.Serialization.Options.DateTimeSerializationOptions options = 
    MongoDB.Bson.Serialization.Options.DateTimeSerializationOptions.UtcInstance; 

var serializer = 
    new MongoDB.Bson.Serialization.Serializers.DateTimeSerializer(options); 

MongoDB.Bson.Serialization.BsonSerializer.RegisterSerializer(
    typeof(DateTime), 
    serializer); 

मुझे यूटीसी के साथ उपयोगकर्ता स्थानीय टाइमज़ोन को स्टोर करने की आवश्यकता भी है। व्याख्या करने के लिए, मुझे लगता है कि जैसे

DateTime WorkItemToCompleteBy{get; set;} 
[BsonDateTimeOptions(Kind = DateTimeKind.Unspecified)] 
DateTime WorkItemToCompleteByLocal{get; set;} 

चला जाता है दो गुण मैं स्थानीय संपदा और अन्य एक में संबंधित यूटीसी मूल्य में ऑस्ट्रेलियाई/अमेरिकी// भारतीय अन्य बार स्टोर करने के लिए करना चाहते हैं। चूंकि दर्जनों समय क्षेत्रों से निपट रहा हूं, मेरे पास कोड है जो यूटीसी को वांछित टाइमज़ोन में परिवर्तित करता है और इसे WorkItemToCompleteByLocal प्रॉपर्टी में संग्रहीत करता है। मैं मोंगो को इस मान को 'as-is' स्टोर करना चाहता हूं और इसे वापस कर दूंगा। समस्या यह है कि मोंगो हमेशा इसे आईएसओडीएट के रूप में स्टोर करता है और मूल्य को यूटीसी संस्करण में परिवर्तित करता है। व्याख्या करने के लिए। तो यूटीसी 0730 घंटे है और मैं ब्रिस्बेन समय की गणना करने के लिए 1730Hours और WorkitemToCompleteByLocal के लिए सेट, वे सहेज

रूप
"WorkItemToCompleteBy" : ISODate("2013-06-05T07:30:00Z"), 
"WorkItemToCompleteByLocal" : ISODate("2013-06-05T12:00:00Z"), 

मोंगो स्थानीय रूप में उपलब्ध कराए गए समय की व्याख्या, सर्वर भारत में जा रहा है और करने के लिए इसे coverts 1200 घंटों के बराबर यूटीसी। हालांकि यह 1730 (आईएसटी अल्बीट) के रूप में मूल्य वापस प्राप्त करता है, यह मेरे उद्देश्य को हरा देता है और मुझे मोंगो पर स्थानीय समय पर आधारित प्रश्नों को चलाने से रोकता है। विचारों से बाहर हूँ। WordItemToCompleteByLocal दिनांक 'As-Is' को संशोधित किए बिना

+1

मुझे एक नई डेटटाइम (स्थानीय। प्रिय, स्थानीय। मॉन्थ ......., Kind.Utc) को हाइड्रेट करके यूटीसी के रूप में 'लोकल' टाइमज़ोन को दोबारा शुरू करके सिस्टम को मूर्ख बनाकर एक काम मिल गया। वह मूल्य अब, डेटा को संग्रहीत किया जाता है और मेरा तर्क जानता है कि स्थानीय कॉलम स्थानीय मूल्य को किस प्रकार कहता है (चाहे वह अपनाए गए काम के कारण यूटीसी कहता है)। मैं इसे तब तक उपयोग करूंगा जब तक मुझे एक बेहतर उत्तर न मिले। –

+0

मैंने स्थानीय समय से निपटने के लिए मोंगोडीबी के जेआईआरए में एक आइटम जोड़ा है, जो इस एसओ प्रविष्टि को भी संदर्भित करता है (एक साइन-अप की आवश्यकता है): https://jira.mongodb.org/browse/DOCS-4086 – akauppi

+0

देखें http: //stackoverflow.com/a/38934986/194717 – Tony

उत्तर

2

सी # चालक का नया संस्करण =>

public class MyMongoDBDateTimeSerializer : DateTimeSerializer 
{ 
    // MongoDB returns datetime as DateTimeKind.Utc, which cann't be used in our timezone conversion logic 
    // We overwrite it to be DateTimeKind.Unspecified 
    public override DateTime Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) 
    { 
     var obj = base.Deserialize(context, args); 
     return new DateTime(obj.Ticks, DateTimeKind.Unspecified); 
    } 

    // MongoDB stores all datetime as Utc, any datetime value DateTimeKind is not DateTimeKind.Utc, will be converted to Utc first 
    // We overwrite it to be DateTimeKind.Utc, becasue we want to preserve the raw value 
    public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, DateTime value) 
    { 
     var utcValue = new DateTime(value.Ticks, DateTimeKind.Utc); 
     base.Serialize(context, args, utcValue); 
    } 
} 
21

इस तरह से मैं मंगोडीबी को कच्चे मूल्य को संग्रहीत करने के लिए मजबूर करता हूं, और डेटटाइम ऑब्जेक्ट में डेटटाइमकिंड विशेषता को अनदेखा करता हूं।

यह आपके व्यापार तर्क पर लागू नहीं हो सकता है, लेकिन हमारे विशेष कारणों से हमारे लिए समझ में आता है।

BsonSerializer.RegisterSerializer(typeof(DateTime), new MyMongoDBDateTimeSerializer()); 


public class MyMongoDBDateTimeSerializer : DateTimeSerializer 
{ 
    // MongoDB returns datetime as DateTimeKind.Utc, which cann't be used in our timezone conversion logic 
    // We overwrite it to be DateTimeKind.Unspecified 
    public override object Deserialize(MongoDB.Bson.IO.BsonReader bsonReader, System.Type nominalType, MongoDB.Bson.Serialization.IBsonSerializationOptions options) 
    { 
     var obj = base.Deserialize(bsonReader, nominalType, options); 
     var dt = (DateTime) obj; 
     return new DateTime(dt.Ticks, DateTimeKind.Unspecified); 
    } 

    // MongoDB returns datetime as DateTimeKind.Utc, which cann't be used in our timezone conversion logic 
    // We overwrite it to be DateTimeKind.Unspecified 
    public override object Deserialize(MongoDB.Bson.IO.BsonReader bsonReader, Type nominalType, Type actualType, MongoDB.Bson.Serialization.IBsonSerializationOptions options) 
    { 
     var obj = base.Deserialize(bsonReader, nominalType, actualType, options); 
     var dt = (DateTime)obj; 
     return new DateTime(dt.Ticks, DateTimeKind.Unspecified); 
    } 

    // MongoDB stores all datetime as Utc, any datetime value DateTimeKind is not DateTimeKind.Utc, will be converted to Utc first 
    // We overwrite it to be DateTimeKind.Utc, becasue we want to preserve the raw value 
    public override void Serialize(MongoDB.Bson.IO.BsonWriter bsonWriter, System.Type nominalType, object value, MongoDB.Bson.Serialization.IBsonSerializationOptions options) 
    { 
     var dt = (DateTime) value; 
     var utcValue = new DateTime(dt.Ticks, DateTimeKind.Utc); 
     base.Serialize(bsonWriter, nominalType, utcValue, options); 
    } 
} 
+3

2.0.1 – Vaibhav

+1

ग्रेट दृष्टिकोण में MongoDB.Bson.Serialization.IBsonSerializationOptions प्रतीत नहीं होता है। यहां तक ​​कि यदि सी # ड्राइवर [BsonDateTimeOptions (Kind = DateTimeKind.Utc) का सम्मान करेगा, तो यह समाधान अधिकांश विकास उपयोग मामलों में बेहतर होगा क्योंकि यह प्रत्येक को निर्दिष्ट करने के बजाय वैश्विक स्तर पर और स्वचालित रूप से सभी डेटटाइम गुणों पर लागू होगा जब आप अनिवार्य रूप से एक भूल जाते हैं तो बग। –

0

.net ड्राइवर संस्करण 2.4 में, इस का उपयोग करें:

using MongoDB.Bson.Serialization; 
using MongoDB.Bson.Serialization.Serializers; 

BsonSerializer.RegisterSerializer(DateTimeSerializer.LocalInstance); 

इस तरह datetime मान प्रकार = में यूटीसी के साथ संग्रहीत किया जाएगा डीबी, लेकिन स्थानीय प्रकार में deserialized।

संबंधित मुद्दे