如何在c#中设置毫秒精度

时间:2016-03-15 15:09:59

标签: c#

我在c#中有一个休息。 有了这个ws,我可以用毫秒来设置日期时间。这是我的请求的一个例子:

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

正如您所看到的,有两个日期以毫秒为单位。第一个日期,以.125毫秒结束。

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

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 个答案:

答案 0 :(得分:2)

  

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

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

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

答案 1 :(得分:1)

  

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

假设您以datetime的身份保存到SQL数据库,这是您可以获得的精度限制:

  

日期时间值四舍五入为.000,.003或.007秒的增量,如下表所示。

Source

如果您想要更高的精度,那么您应该使用不同的列类型:

  

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

(从同一页面得到更多重视)。

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