복붙노트

[MONGODB] 보관 UTC와 몽고에 현지 날짜

MONGODB

보관 UTC와 몽고에 현지 날짜

나는 상점 UTC로 날짜하는 몽고의 C # 구현을 가지고있다.

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);

나는 또한 UTC와 함께 사용자 로컬 시간대를 저장할 필요가있다. 설명하기 위해, 내가 좋아가는 두 가지 속성을 가지고

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

나는 로컬 속성과 다른 하나의 각 UTC 값에 호주 / 미국 / 인도 / 기타 시간을 저장하고 싶습니다. 오전 시간대 수십 다루고 있기 때문에, 나는 코드가 그 변환 WorkItemToCompleteByLocal 속성에 원하는 시간대 저장을에 UTC. 나는 '있는 그대로'이 값을 저장하고 내게 돌아 몽고을하고 싶습니다. 문제는 몽고가 항상 ISODate로 저장하고 UTC 버전으로 값을 변환하는 것입니다. 설명하기. UTC는 0730 시간이고 내가 1730Hours 브리즈번 시간을 계산하고 WorkitemToCompleteByLocal로 설정하면, 그들은으로 저장하세요

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

몽고 지역으로 제공 시간을 해석 1200 시간에 해당하는 UTC에 인도와 깃을에있는 서버. 이 검색하는 동안 값은 1730 (이기는하지만 IST) 그것은 내 목적과 몽고에 로컬 시간을 기반으로 쿼리를 실행 한 방지 날 패배로 백업 할 수 있습니다. 아이디어를 밖으로입니다. 어떤 도움을 수정하지 않고 도움말 저장합니다 WorkItemToCompleteByLocal 날짜를 '있는 그대로'에 감사드립니다

해결법

  1. ==============================

    1.C #을 드라이버의 새로운 버전 =>

    C #을 드라이버의 새로운 버전 =>

        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);
        }
    }
    
  2. ==============================

    2.이것은 내가 원시 값을 저장하고, DateTime 개체의 DateTimeKind 속성을 무시 MongoDB를 강제하는 방법입니다.

    이것은 내가 원시 값을 저장하고, DateTime 개체의 DateTimeKind 속성을 무시 MongoDB를 강제하는 방법입니다.

    이것은 당신의 비즈니스 로직에 적용하지만, 우리의 특정한 이유로 우리를 이해하지 않을 수 있습니다.

    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. ==============================

    3..NET 드라이버 버전 2.4에서는이를 사용 :

    .NET 드라이버 버전 2.4에서는이를 사용 :

    using MongoDB.Bson.Serialization;
    using MongoDB.Bson.Serialization.Serializers;
    
    BsonSerializer.RegisterSerializer(DateTimeSerializer.LocalInstance);
    

    이 방법 날짜 값은 DB에 UTC 종류 =으로 저장하지만, 지방의 종류에 직렬화 복원됩니다.

  4. from https://stackoverflow.com/questions/16901393/storing-utc-and-local-datetime-in-mongo by cc-by-sa and MIT license