2016-03-15 107 views
1

我在c#中休息ws。 有了这个ws,我可以把毫秒的日期时间。这是我的要求的一个例子:如何设置精度毫秒在C#

{ "sensorId": 656, 
"value": "128", 
"timestamp": "2016-06-01 11:20:50.125", 
"values": 
    [{"value":"2064","timestamp":"2016-06-09 13:23:50.100"}] 
} 

正如你可以看到有两个日期与毫秒。第一次约会,以.125毫秒结束。

在我的代码中,我使用此代码反序列化字段日期。

public class SensorDateTimeConverter : DateTimeConverterBase//IsoDateTimeConverter 
    { 
     private const string Format = "yyyy-MM-dd HH:mm:ss.fff"; 

     public override void WriteJson(JsonWriter writer, 
             object value, 
             JsonSerializer serializer) 
     { 
      writer.WriteValue(((DateTime)value).ToString(Format)); 
      writer.Flush(); 
     } 

     public override object ReadJson(JsonReader reader, 
             Type objectType, 
             object existingValue, 
             JsonSerializer serializer) 
     { 
      if (reader.Value == null) 
      { 
       return null; 
      } 

      var s = reader.Value.ToString(); 
      DateTime result; 

      if (DateTime.TryParseExact(s, 
             Format, 
             CultureInfo.InvariantCulture, 
             DateTimeStyles.None, 
             out result)) 
      { 
       return result; 
      } 

      return DateTime.Now; 
     } 
    } 

如果我试图检查方法ReadJson的数据是正确的解析和毫秒是“125”。

如果我尝试保存数据库的这个值,我会看到相同的日期,但是.127毫秒。

为什么?

回答

2

如果我尝试检查ReadJson方法的数据是否正确解析,毫秒是“125”。

这告诉你问题不在于JSON转换。所有发布的代码因此与问题无关。你已经成功地平分了问题所在,但是你调查了错误的分区。

SQL Server的datetime数据类型的精度有限。使用datetime2

+0

是在JSon转换后的日期是正确的。我用日期时间使用SQL Server – bircastri

1

如果我尝试保存数据库的这个值,我会看到相同的日期,但是.127毫秒。

假设你保存到一个SQL数据库为datetime这是精度的限制,你可以得到:

datetime值四舍五入为增量.000,.003,或.007秒,如下表所示。

Source

如果你想更精确,那么你应该使用不同的列类型:

使用时间,日期,DATETIME2和DATETIMEOFFSET数据类型的新工作。这些类型与SQL标准一致。他们更便携。 时间,datetime2和datetimeoffset提供更多的秒精度。 datetimeoffset为全局部署的应用程序提供时区支持。

(来自同一页,增加了重点)。

datetime2 page有关于此结构及其局限性的更多信息。