【问题标题】:C# date formattingC# 日期格式化
【发布时间】:2009-08-18 14:24:00
【问题描述】:

这是我多次遇到的问题,我确信我缺少一个优雅的解决方案。

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

到目前为止,我一直在使用 CultureInfo 对象将这些转换为正确的格式:

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

但是,我最近才意识到转换不知道原始 DateTime 所在的文化(正如我所说,它可能是美国或英国),因为它只是一个字符串。

对于日期字符串,例如“06/15/2009”,这很好,因为转换识别出“15”不能是月份。然而,日期字符串“06/07/2009”将始终有效,但根据原件是美国还是英国,它可能指的是不同的日期和月份。

一般来说,有没有更好的方法来处理 DateTime 以减少这些歧义?谢谢。

编辑: 是的,所以似乎没有可靠的方法可以始终转换为正确的格式,因为我的信息有限。

这些 DateTime 字符串的一个来源是我无法控制的 .dll。但是,我确实可以控制此 .dll 用于访问存储信息的数据库的 SQL 登录名。如果我将此登录的语言设置更改为英式英语(当前是美式英语),它会以该格式检索 DateTime,还是没有效果?当然,我必须检查它是否没有搞砸其他任何事情,但它可以工作吗?

【问题讨论】:

  • 对于程序员来说,这是最让人头疼的原因……
  • 偶数日月年有时是一种痛苦。年月日时分秒最好:)

标签: c# datetime


【解决方案1】:

您需要从源头解决问题:您收到的数据格式不明确。如果您不能自己更改数据源,则应该使用格式字符串或类似的东西来装饰它们,以便您知道以一种或另一种方式处理整个数据源。

没有这些信息,您就无法可靠地解析数据。

【讨论】:

  • 说得好。这个问题让我想起了在没有支持数据的情况下被告知要在事后拆分名称(第一个,最后一个)。你可以做到……但它不可靠。
  • 如果所有系统都以 UTC 格式处理日期时间并且只在显示时间进行转换。
  • @goap:这实际上并不能解决所有问题。有时您需要知道本地时间 + 时区。例如,您无法在不知道时区的情况下“下周同一时间”进行锻炼。
【解决方案2】:

我通常做的(任何解析)是:

  1. TryParse 使用用户的文化
  2. 如果失败,则使用区域性不变标志进行解析

【讨论】:

    【解决方案3】:

    如果我正确理解您的问题,这有点超出您的控制 - 如果您从外部来源获取这些日期,您需要知道它们的格式。一旦您在 C# 中获得 DateTime 对象,初始格式就不会没关系 - 它只包含日期和时间,无论格式如何。

    另一方面,为什么不将它们作为某种日期时间数据库格式从数据库中获取?

    【讨论】:

      猜你喜欢
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多