0

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

4

2 回答 2

2

ADO.NET 是强类型的;有一些众所周知的类型可以存储大多数数据。在日期的情况下,那将是DateTime在 .NET 和datetime大多数数据库系统中。如果您需要担心文化,那么您已经做错了,因为您将数据作为字符串而不是DateTime/传递datetime

然后,这会使您在这里的担忧变得多余:

我厌倦的是有人以一种格式保存到数据库,然后一个法国人想要读取日期和他们自己的格式(是的,我应该以 utc 格式存储)。

因为DateTime/datetime 没有格式的概念- 它只是一个日期/时间值。字符串数据的任何 UI 呈现/解析都应该完全隔离并特定于 UI。除了你应该(在谈论日期/时间时)使用DateTime/datetime独占的 UI 代码。

同样,在存储整数时,您应该使用int.

于 2013-02-14T07:21:09.873 回答
0

如果日期仅存储为“02/11/2013”​​而没有任何其他文化识别信息,您将无法知道如何正确解释它!您完全正确担心具有 en-FR 文化的人可能会将日期保存到数据库中为“02/11/2013”​​,这意味着 11 月 2 日,然后具有 en-US 文化的人可能会读取该日期并解释它如 2 月 11 日。

如果您知道当前文化是相关的,则应该只传递当前文化,这意味着您知道日期字符串是使用该文化生成的。

更好的方法是首先不要存储这样的日期。最好以包含时区和格式信息的格式存储日期,例如Internet 日期/时间 RFC 3339格式。

或者,如果你不能,至少确保获取日期并始终将其转换为 en-US 文化,然后再存储到数据库中,而不是在从数据库中读取时将该文化传递给 DateTime.Parse。

在以 RFC 3339 格式序列化/反序列化日期时,日期的 .NET XML 序列化代码可以派上用场。有关更多信息,请参阅此 SO 帖子

于 2013-02-13T22:10:25.217 回答