我正在尝试将来自源的日期解析为"2013年11月2日"
在我的应用程序中,我将用户的区域性设置为en-CA或en-FR,其日期格式为"dd/MM/yyyy"或"M/d/yyyy"
如果我解析日期并输入格式,这会起作用吗?还是取决于我保存到数据库的格式?
if (DateTime.TryParseExact(dateString, Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern, null, System.Globalization.DateTimeStyles.None, out dtResult))
{
dt = dtResult;
}
我现在可以好好思考,所以我需要澄清一下。
我以"dd/MM/yyyy"或"M/d/yyyy"的格式传递,无论源是什么格式,这种格式都是日期吗?还是我告诉日期时间解析源将是这种格式,所以使用这种格式?
我厌倦的是,有人以一种格式保存到数据库,然后一个法国人想读取日期和他们自己的格式(是的,我应该存储在utc中)。
ADO.NET是强类型的;存在用于存储大多数数据的众所周知的类型。对于日期,在.NET中为DateTime
,在大多数数据库系统中为datetime
。如果您需要担心区域性,那么您已经做错了,因为您将数据作为字符串而不是DateTime
/datetime
传递。
这会使您在这里的担忧变得多余:
我厌倦的是,有人以一种格式保存到数据库,然后一个法国人想读取日期和他们自己的格式(是的,我应该存储在utc中)。
因为DateTime
/datetime
没有格式的概念,它只是一个日期/时间值。字符串数据的任何UI表示/解析都应该是完全独立的,并且特定于UI。除了UI代码之外,您应该(在谈论日期/时间时)只使用DateTime
/datetime
。
类似地,在存储整数时,应该使用int
。
如果日期仅存储为"2013年11月2日",而没有任何其他区域性标识信息,则您无法知道如何正确解释它!你完全正确地担心,具有en FR文化的人可能会将日期保存到数据库中,即"2013年11月2日",即11月2号,然后具有en US文化的人会阅读该日期并将其解释为2月11日。
只有当您知道当前区域性是相关的时,才应该传递该区域性,这意味着您知道日期字符串是使用该区域性生成的。
一个更好的方法是一开始就不要存储这样的日期。最好以包括时区以及格式信息(如Internet日期/时间RFC 3339格式)的格式存储日期。
或者,如果你做不到,至少要确保在存储到数据库中之前,将日期转换为en-US区域性,然后将该区域性传递给DateTime.Passe。
在以RFC 3339格式序列化/反序列化日期时,用于日期的.NET XML序列化代码可以派上用场。请参阅此SO帖子了解更多信息。。