使用JsonConverter将所有日期时间值保持格式相同

时间:2018-05-19 16:49:30

标签: datetime json.net

我有一个用例,其中所有日期/时间值必须使用以下格式保存在JSON文档中:

yyyy-MM-ddTHH:mm:ss.fffffff

换句话说,无论日期/时间值如何,所有日期/时间值的长度都是27个字符,例如:

System.DateTime.MinValue = "0001-01-01T00:00:00.0000000"
System.DateTime.MaxValue = "9999-12-31T23:59:59.9999999"
19-May-2018 10:35:12 am  = "2018-05-19T10:35:12.0000000"

不幸的是,Json.Net决定以各种格式格式化日期/时间,具体取决于日期/时间值。我试图在日期/时间属性上使用JsonConverter属性,即:

[JsonConverter( typeof( datetime_iso8601_converter ) )]
public System.DateTime created_utc;

我的转换器类如下:

public class datetime_iso8601_converter : Newtonsoft.Json.Converters.IsoDateTimeConverter
{

   public datetime_iso8601_converter()
   {

      // Set format that all DateTime values will use ...

      base.DateTimeFormat = "yyyy-MM-ddTHH:mm:ss.fffffff";

   }

}

如果我使用调试器运行测试,例如:

created_utc = System.DateTime.MinValue;

我可以看到执行以下行:

base.DateTimeFormat = "yyyy-MM-ddTHH:mm:ss.fffffff";

但是,写入的结果JSON日期/时间值为:

"0001-01-01T00:00:00"

第二次尝试:

我尝试了以下转换器......

public class datetime_iso8601_converter : Newtonsoft.Json.Converters.DateTimeConverterBase
{

   // The format that all datetime values will use ...

   private const String k_fmt_datetime_iso8601 = "yyyy-MM-ddTHH:mm:ss.fffffff";

   // Write the given datetime value using the format above ...

   public override void WriteJson( JsonWriter writer, object value, JsonSerializer serializer )
   {

      if ( value is System.DateTime )
      {

         String dt_str;

         System.DateTime dt;

         dt = ( System.DateTime ) value;

         dt_str = dt.ToString( k_fmt_datetime_iso8601 );

         writer.WriteRawValue( dt_str );

      }
      else
      {

         throw new ArgumentException( "value is not System.DateTime" );

      }

   }

   // Return a datetime value ...

   public override object ReadJson( JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer )
   {

      if ( reader.TokenType != Newtonsoft.Json.JsonToken.Date )
      {

         throw new Exception( "Invalid token. Expected Date" );

      }

      return reader.Value;

   }

}

再次使用调试器,我可以看到 dt_str 设置为以下值:

"0001-01-01T00:00:00.0000000"

但实际写入的值是:

"0001-01-01T00:00:00" 

我不明白为什么。

如何以所需格式保存所有日期/时间值?

提前致谢。

1 个答案:

答案 0 :(得分:0)

上述问题出现在使用Azure Functions的环境中。 Azure函数1.0.13的当前版本似乎不支持绑定重定向,即:

[JsonConverter( typeof( datetime_iso8601_converter ) )]

然而,release 1.22.0 will support JsonSettings和绑定重定向(希望如此)。