C#日期格式化

3

这是我多次遇到的问题,我相信我错过了一些优雅的解决方案。

我在c#中有一些DateTime变量,它们来自各种SQL表/网站/ Web服务,通常作为字符串发送。问题在于,其中一些来源设置为英语(美国),而另一些设置为英语(英国)。对于其中一些我没有控制权,因为我非常希望将它们全部设置为一个文化或另一个文化。

直到现在,我一直在使用CultureInfo对象进行转换,以正确格式化它,例如:

CultureInfo ci = new CultureInfo("en-GB");
Convert.ToDateTime(inputDateTimeString, ci);

然而,最近才让我意识到,由于DateTime只是一个字符串,所以转换程序并不知道原始DateTime所在的文化(就像我说的,它可能是美式或英式)。
对于日期字符串,比如"06/15/2009",这没问题,因为转换会意识到“15”不能是月份。然而,一个日期字符串"06/07/2009"将总是有效的,但是,根据原始字符串是美式还是英式,它可能指的是不同的天和月。
有没有更好的通用DateTime处理方法来减少这些歧义?谢谢。
编辑: 看起来没有可靠的方法来总是将字符串转换为正确的格式,因为我的信息很有限。
这些DateTime字符串的一个来源是我无法控制的.dll文件。然而,我可以控制这个.dll使用访问存储信息的数据库的SQL登录。如果我改变此登录的语言设置为英式英语(它目前是美式英语),那么它会检索该格式的DateTime,还是没有任何效果?当然,我必须检查它是否破坏了其他任何内容,但它可能有效吗?

对于程序员来说,这是导致许多头痛的原因... - Meta-Knight
有时候,年月日的顺序真是让人头疼。年月日时分秒才是最好的 :) - MartW
3个回答

7
你需要从源头解决问题:你得到的数据格式含糊不清。如果你无法改变数据源本身,你应该使用格式字符串或类似的方法来装饰它们,这样你就知道如何以一种方式或另一种方式处理整个数据源。
没有这些信息,你就不能可靠地解析数据。

说得好。这个问题让我想起了被告知在没有支持数据的情况下分割名称(名,姓)之后的情况。你可以做到...但不可靠。 - Russell Steen
2
如果所有系统都使用UTC格式处理日期和时间,并只在显示时进行转换,那该多好啊! - Gus Paul
1
@goap:这并不能解决所有问题。有时候你需要知道当地的时间和时区。例如,如果不知道时区,你就无法计算出“下周同一时间”的时间。 - Jon Skeet

0

我通常做的事情(无论是什么解析)是:

  1. 使用用户的文化尝试解析
  2. 如果失败,使用文化不变标志进行解析

0
如果我正确理解了你的问题,那么它有点超出了你的控制 - 如果你从外部来源获取这些日期,你需要知道它们的格式。一旦你在C#中获得了一个DateTime对象,初始格式就不重要了 - 它只包含日期和时间,而不管格式如何。
另一方面,为什么不从数据库中以某种日期时间数据库格式获取它们呢?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接