我正在尝试将来自源的日期解析为“02/11/2013”
在我的应用程序中,我将用户的文化设置为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中)。
答案 0 :(得分:2)
ADO.NET是强类型的;存在用于存储大多数数据的众所周知的类型。对于日期,在.NET中为DateTime
,在大多数数据库系统中为datetime
。如果您需要担心文化,那么您已经做错了,因为您将数据作为字符串而不是DateTime
/ datetime
传递
这使您的担忧变得多余:
我厌倦的是有人以一种格式保存到数据库,然后法国人想要读取日期和他们自己的格式(是的,我应该存储在utc中)。
因为DateTime
/ datetime
没有格式概念 - 它只是一个日期/时间值。字符串数据的任何UI表示/解析应该完全隔离并且特定于UI。除了UI代码之外,您应该(在谈论日期/时间时)专门使用DateTime
/ datetime
。
同样,存储整数时,您应该使用int
。
答案 1 :(得分:0)
如果日期仅作为“02/11/2013”存储而没有任何其他文化识别信息,则您无法知道如何正确解释它!你绝对正确地担心有一个en-FR文化的人可能会在数据库中保存一个日期,因为“02/11/2013”意味着11月2日,那么一个有美国文化的人可能会阅读那个日期并解释它截至2月11日。
如果您知道相关信息,则应该只传递当前文化,这意味着您知道日期字符串是使用该文化生成的。
更好的方法是不要首先存储这样的日期。最好以包含时区的格式存储日期,以及Internet Date/Time RFC 3339格式等格式信息。
或者,如果你不能,至少确保在存储到数据库之前将日期转换为说en-US文化,并且在从数据库读取时将该文化传递给DateTime.Parse。
在RFC 3339格式中序列化/反序列化日期时,日期的.NET XML序列化代码可以派上用场。见this SO post for more info ..