我添加了自定义JsonSerializerSettings
,以确保日期始终反序列化为en-US culture
。
JsonConvert.DeserializeObject<T>(responseString, new JsonSerializerSettings()
{ Culture = new System.Globalization.CultureInfo("en-US") });
但是,这对Hijri日历不起作用,日期仍然在文化日历中反序列化。
为什么呢?我在这里缺少什么?
是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回复 {.....,&#34; effectiveStartDate&#34;:&#34; 2018-01-02T00:00:00&#34;,....}
反序列化后
15/04/39 12:00:00
而我的预期是
2018年2月1日
答案 0 :(得分:6)
我认为你误解了代码是如何工作的。反序列化过程将是这样的:
创建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
文化仅适用于已经完成的反序列化过程。
如果要以与应用程序文化不同的格式显示日期,则需要明确告知应用程序。例如,您可以通过toString
DateTime
方法设置格式,和/或通过代码暂时更改您的文化设置。
答案 1 :(得分:0)
除了上面提到的ADyson之外。
取自官方source。每个想要了解更多有关DateTime
的开发人员必须阅读的文章在内部,所有DateTime值都表示为刻度数 (自100纳秒间隔的数量)已经过去了 001. 1月1日午夜12:00:00实际的DateTime值是 独立于该值在a中显示时的显示方式 用户界面元素或写入文件时。一个人的外表 DateTime值是格式化操作的结果。格式化是 将值转换为字符串表示的过程。 因为日期和时间值的出现取决于此类 文化因素,国际标准,应用要求, 和个人偏好,DateTime结构提供了很多 通过重载灵活地格式化日期和时间值 其ToString方法。默认的DateTime.ToString()方法返回 使用当前值的日期和时间值的字符串表示形式 文化的短期和长期模式。以下示例使用 默认的DateTime.ToString()方法显示日期和时间 使用短期和长时间模式的美国文化, 在运行该示例的计算机上的当前文化。
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