在DocumentDb中将TimeStamp转换为属性本身的日期

时间:2016-04-14 11:36:09

标签: timestamp azure-cosmosdb

我知道如何在方法中将TimeStamp转换为Date,但我想在我的属性上实现一些东西来转换DocumentDb中最后更新文档的TimeStamp。像下面的东西 -

    [JsonProperty(PropertyName ="_ts")]
    /*    What to insert here --   [JsonConverter(typeof(???))]     */                 
    public string TimeStamp { get; set; }

请不要在代码中提供实施方法。我需要一些东西来转换属性本身。

1 个答案:

答案 0 :(得分:0)

DocumentDb以Unix时间戳格式(自1970年1月1日,00:00 UTC以来的秒数)存储Timestamp值,因此您需要编写自己的转换器来装饰您的属性。这是一个例子:

using System;
using Newtonsoft.Json;

namespace Converters
{
    public class UnixDateTimeConverter : JsonConverter
    {
        public override void WriteJson(JsonWriter writer,
            object value, JsonSerializer serializer)
        {
            long seconds;
            if (value is DateTime)
            {
                var dt = (DateTime)value;
                seconds = !dt.Equals(DateTime.MinValue) ?
                    new DateTimeOffset(dt).ToUnixTimeSeconds() : long.MinValue;
            }
            else
            {
                throw new Exception("Expected date object value.");
            }

            writer.WriteValue(seconds);
        }

        public override object ReadJson(JsonReader reader, Type objectType,
            object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.None || reader.TokenType == JsonToken.Null)
                return null;

            if (reader.TokenType != JsonToken.Integer)
            {
                throw new Exception(
                    $"Unexpected token parsing date. Expected Integer, got {reader.TokenType}.");
            }

            var seconds = (long)reader.Value;
            return DateTimeOffset.FromUnixTimeSeconds(seconds).DateTime;
        }

        public override bool CanConvert(Type objectType)
        {
            return objectType == typeof(DateTime) || objectType == typeof(DateTime?);
        }
    }
}

请记住,此代码仅适用于.NET 4.6 - 为了定位早期的框架,您应该自己进行转换。