我在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毫秒。
为什么?
答案 0 :(得分:2)
如果我尝试检查方法ReadJson,数据是正确解析的,毫秒是“125”。
这告诉您问题不在于JSON转换。因此,所有发布的代码都与问题无关。您已经成功地将问题分成两部分,但是您调查了错误的分区。
SQL Server的datetime
数据类型的精度有限。使用datetime2
。
答案 1 :(得分:1)
如果我尝试保存我的数据库的这个值,我会看到相同的日期但是.127毫秒。
假设您以datetime
的身份保存到SQL数据库,这是您可以获得的精度限制:
日期时间值四舍五入为.000,.003或.007秒的增量,如下表所示。
如果您想要更高的精度,那么您应该使用不同的列类型:
使用time,date,datetime2和datetimeoffset数据类型进行新工作。这些类型与SQL标准一致。它们更便携。 time,datetime2和datetimeoffset提供更多的秒精度。 datetimeoffset为全局部署的应用程序提供时区支持。
(从同一页面得到更多重视)。
datetime2
page有关于此结构及其局限性的更多信息。