- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个 Web API,但在 DateTimes
的 JSON 序列化方面遇到问题。经过一些测试后,我只能得出结论,Newtonsoft.Json.JsonConvert
和/或 Newtonsoft IsoDateTimeConverter
的行为不是我所期望的。
考虑一下:
// Arrange
var noonUtc = new DateTime(2016, 05, 12, 12, 0, 0, DateTimeKind.Utc);
var noon = new DateTime(2016, 05, 12, 12, 0, 0, DateTimeKind.Unspecified);
var settings = new JsonSerializerSettings();
settings.Converters.Add(new IsoDateTimeConverter
{
Culture = CultureInfo.InvariantCulture,
DateTimeStyles = DateTimeStyles.AdjustToUniversal
});
// Act
var utcJson = JsonConvert.SerializeObject(noonUtc, settings); // "\"2016-05-12T12:00:00Z\""
var json = JsonConvert.SerializeObject(noon, settings); // "\"2016-05-12T10:00:00Z\""
... // Assertions
好的,DateTime
与 DateTimeKind.Unspecified
的时间已从 12 点调整为 10 点。我在斯德哥尔摩,目前比 UTC 早两个小时,所以很公平。
但是,让我们更改序列化器设置以使用 DateTimeStyles.AssumeUniversal
,如下所示:
settings.Converters.Add(new IsoDateTimeConverter
{
Culture = CultureInfo.InvariantCulture,
DateTimeStyles = DateTimeStyles.AssumeUniversal
});
这会产生完全相同的字符串,因此也会将 DateTime
与 DateTimeKind.Unspecified
调整两个小时!难道不应该假设日期时间已经是 UTC 时间并保持原样吗?我在这里缺少什么?
最佳答案
我认为你没有遗漏任何东西;这看起来可能是 IsoDateTimeConverter
中的一个错误。这是来自 source 的相关代码:
if ((_dateTimeStyles & DateTimeStyles.AdjustToUniversal) == DateTimeStyles.AdjustToUniversal
|| (_dateTimeStyles & DateTimeStyles.AssumeUniversal) == DateTimeStyles.AssumeUniversal)
{
dateTime = dateTime.ToUniversalTime();
}
如您所见,在调用 ToUniversalTime()< 之前,它仅查看
;它从不检查日期的 _dateTimeStyles
是否设置为 AdjustToUniversal
或 AssumeUniversal
/Kind
属性。
DateTime.ToUniversalTime()
的文档是这样说的:
Starting with the .NET Framework version 2.0, the value returned by the
ToUniversalTime
method is determined by theKind
property of the currentDateTime
object. The following table describes the possible results.Kind | Results
----------- | ----------------------------------------------------------
Utc | No conversion is performed.
Local | The current DateTime object is converted to UTC.
Unspecified | The current DateTime object is assumed to be a local time,
| and the conversion is performed as if Kind were Local.
所以,是的,在这种情况下转换器绝对不应该调用 ToUniversalTime
。您可能想要report an issue .
目前,您可以通过实现具有正确行为的替换转换器(从原始转换器派生)来解决此问题。这可能更接近您想要的:
public class CorrectedIsoDateTimeConverter : IsoDateTimeConverter
{
private const string DefaultDateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK";
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (value is DateTime)
{
DateTime dateTime = (DateTime)value;
if (dateTime.Kind == DateTimeKind.Unspecified)
{
if (DateTimeStyles.HasFlag(DateTimeStyles.AssumeUniversal))
{
dateTime = DateTime.SpecifyKind(dateTime, DateTimeKind.Utc);
}
else if (DateTimeStyles.HasFlag(DateTimeStyles.AssumeLocal))
{
dateTime = DateTime.SpecifyKind(dateTime, DateTimeKind.Local);
}
}
if (DateTimeStyles.HasFlag(DateTimeStyles.AdjustToUniversal))
{
dateTime = dateTime.ToUniversalTime();
}
string format = string.IsNullOrEmpty(DateTimeFormat) ? DefaultDateTimeFormat : DateTimeFormat;
writer.WriteValue(dateTime.ToString(format, Culture));
}
else
{
base.WriteJson(writer, value, serializer);
}
}
}
关于datetime - 使用 DateTimeStyles.AssumeUniversal 时,为什么 JsonConvert 会使用 DateTimeKind.Unspecified 更改 DateTimes 的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37203207/
这两个产生相同的结果,但我预计它们将关闭 6 小时。我有什么不明白的? Console.WriteLine(new DateTime(1970, 1, 1, 12, 1, 0, DateTimeKin
目前当我使用 {Timestamp}在 outputTemplate 中,它似乎是由 DateTime.Now 生成的因此属于 DateTimeKind.Local flavor ,因为当我给它一个“
var dt1 = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified); var dt2 = new DateTime(1, 1,
我有一个像这样的 POCO: public class BlogEntry { public string Title { get; set; } public DateTime Da
我正在编写一个程序来处理 US Airways Flight 1549 的成绩单,从本地时间2009年1月15日15:05:34开始。 我打算将时间存储在 DateTime 变量中,但对 DateTi
我只是想知道 JavaScript 中 C# DateTimeKind.Local 的等价物以及如何在 JavaScript 中设置它 最佳答案 JavaScript 中的大多数 DateTime 本
storeDateTimeAsTicks 是最近 SQLite Net 实现中的默认行为,与存储为字符串相比,它还具有性能优势。 不幸的是,当将 DateTime 刻度保存到数据库时,它会忽略时区,并
是否可以在 Kind == DateTimeKind.Utc 的实体对象中定义 DateTime 属性?通过使用 .edmx 文件或 t4 模板? 如果可能使用 t4,请描述如何更改属性。目前,该属性
这怎么可能?我预计 UTC 和本地时间至少相差 1 小时 使用 C# 在 Visual Studio 中查询 Azure 上的 cosmosDB 时出现问题 最佳答案 As per the MSDN
当我从 C# 查询涉及 DateTime 字段的 SqlServer 数据库时,返回的 System.DateTime 具有 Kind==Unspecified,这不足为奇因为 SqlServer D
我有一个数据库,其中所有日期都是 UTC,并且驱动程序总是向我发送带有 DateTimeKind.Unspecified 的 DateTime 对象。我想假设它们是 UTC 时间并转换为本地时间。 使
比方说,我有一个这样的字符串 - “2014-09-30T20:38:18.280”,我如何将其解析为 DateTimeKind.Utc 的 DateTime 字段。 当我执行 DateTime.Pa
这个问题在这里已经有了答案: Entity Framework DateTime and UTC (18 个答案) 关闭 6 年前。 我有一个 C# 程序,其中所有 DateTime 对象都是 Da
有没有办法指定我希望 OrmLite 实现的所有 DateTime 设置为 UTC 类型? 插入行时,我通过存储过程在数据库中存储大量 DateTime: insert [Comment] ( B
我有一个应用程序,它可以从 SQL 读取数据并通过 WCF 将其发送到客户端应用程序,其方式与此类似: SqlDataAdapter da = new SqlDataAdapter( cmd ) Da
如何通过 ProtoBuf 使用 DateTimeKind 选项序列化日期时间字段。反序列化时,我想要带有 DateTimeKind 选项的日期时间字段。 我知道我们可以通过添加一个附加属性来将反序列
这个问题在这里已经有了答案: How to make ASP.Net MVC model binder treat incoming date as UTC? (7 个答案) 关闭 5 年前。 我在
我想解析一个代表 UTC 格式的日期时间的字符串。 我的字符串表示包括祖鲁时间规范,该规范应指示该字符串表示 UTC 时间。 var myDate = DateTime.Parse("2012-09-
我正在构建一个 Web API,但在 DateTimes 的 JSON 序列化方面遇到问题。经过一些测试后,我只能得出结论,Newtonsoft.Json.JsonConvert 和/或 Newton
我继承了 C# 代码,其中包含大量 DateTimes,其中 Kind 属性为 DateTimeKind.Unspecified。这些被送入 Datetime.ToUniversalTime() 返回
我是一名优秀的程序员,十分优秀!