如何在我的ado.net代码中检查当前的文化?

时间:2013-02-13 22:06:13

标签: c# datetime ado.net

我正在尝试将来自源的日期解析为“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中)。

2 个答案:

答案 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 ..