我添加了自定义JsonSerializerSettings
以确保日期始终反序列化为en-US culture
。
JsonConvert.DeserializeObject<T>(responseString, new JsonSerializerSettings()
{ Culture = new System.Globalization.CultureInfo("en-US") });
但是,这不适用于回历,并且日期仍在 ar 区域性日历中反序列化。
为什么?我在这里错过了什么?
是 T
public partial class T
{
--------------------
public Nullable<System.DateTime> EffectiveStartDate { get; set; }
public Nullable<System.DateTime> EffectiveEndDate { get; set; }
public Nullable<System.DateTime> SourceDate { get; set; }
-----------------
}
Json 响应{ ..... , "有效开始日期":"2018-01-02T00:00:00", .... }
反序列化后
39-04-15 12:00:00
而我的期望是
2018/1/2
我想你误解了代码的工作方式。反序列化过程将如下所示:
-
创建一个
T
实例(我们称之为x
)。 -
开始从 JSON 中读取属性,并在
T
中找到匹配的属性。将 JSON 属性转换为 C# 变量,并将它们添加到x
中的正确属性。 -
当我们到达
effectiveStartDate
属性时,它会将值反序列化为 DateTime 对象。为了解析 JSON 中的字符串,它会引用您提供的en-US
区域性设置,以防字符串以美国格式显示日期(例如 mm/dd/yyyy)。但是,日期是ISO格式,这是明确的,计算机可以轻松读取,而无需被告知会发生什么。所以事实上,在这种情况下,文化设置根本不重要。 -
将解析的日期存储在
DateTime
对象中。DateTime
内部不使用特定格式 - 它只是将日期存储为数字。格式仅用于将日期序列化为字符串,或向人类显示它们。
反序列化现已完成,您可以在代码中自由使用常规 C# 对象。
大概你然后尝试在代码中的某处或通过调试器读取x.effectiveStartDate
值(你还没有向我们确切显示你正在做什么来查看日期)。不可避免地,由于你想要查看它,C# 将存储在 DateTime 对象中的数字输出为人类可读的日期字符串。请注意,反序列化过程已完成,您现在返回到应用程序的上下文中。因此,您会看到根据ar
区域性及其关联的日历样式设置日期格式,因为这是应用程序的区域性。en-US
区域性仅适用于反序列化过程,该过程已经完成。
如果要以与应用程序区域性不同的格式显示日期,则需要明确告知应用程序。例如,您可以通过DateTime
的toString
方法设置格式,和/或通过代码临时更改区域性设置。
除了上面提到的
。取自官方来源。每个开发人员都想知道更多关于日期时间的必读算术
在内部,所有日期时间值都表示为刻度数 (自那时以来经过的 100 纳秒间隔数) 0001 年 1 月 1 日午夜 12:00:00。实际日期时间值为 与该值在 用户界面元素或写入文件时。外观 日期时间值是格式化操作的结果。格式为 将值转换为其字符串表示形式的过程。 因为日期和时间值的外观取决于 文化、国际标准、应用要求等因素, 和个人喜好,日期时间结构提供了大量的 通过重载灵活设置日期和时间值的格式 的 ToString 方法。默认的 DateTime.ToString() 方法返回 使用当前日期和时间值的字符串表示形式 文化的短日期和长时间模式。以下示例使用 用于显示日期和时间的默认 DateTime.ToString() 方法。 使用 en-US 区域性的短日期和长时间模式, 运行示例的计算机上的当前区域性。
DateTime date1 = new DateTime(2008, 3, 1, 7, 0, 0);
Console.WriteLine(date1.ToString(System.Globalization.CultureInfo.CreateSpecificCulture("fr-FR")));
// Displays 01/03/2008 07:00:00
[1]: https://msdn.microsoft.com/en-us/library/system.datetime(v=vs.110).aspx