【问题标题】:How to standardize datetime format for all regions?如何标准化所有地区的日期时间格式?
【发布时间】:2014-07-30 15:04:18
【问题描述】:

在我的程序中,我将当前时间插入到 sql 服务器中的 sql DateTime 列中。 因为该程序被世界各地的用户使用,我发现一些美国用户收到了一个错误(这不会导致程序崩溃),我相信这是因为不同的日期和时间格式而发生的。

我使用以下代码行来获取特定时区的当前时间,但我知道对于不同的用户,我将获得不同的时间格式。 例如,对于美国用户,我会得到“MM-dd-yyyy”,而对于欧洲用户,我会得到“dd/MM/yyyy”。

Dim CurrentTime As DateTime = System.TimeZoneInfo.ConvertTime(DateTime.Now, TimeZoneInfo.FindSystemTimeZoneById("SOME LOCAL TIME ID"))

我一直试图弄清楚如何在插入服务器之前标准化这种格式,但没有任何运气。 希望这里有人可以提供帮助。

谢谢!

【问题讨论】:

  • 它更可能与您如何向这些用户显示日期有关。 Date 只是一个 Long 值,它对 Yanks 和英国人和德国人的意义相同。它的显示方式因当地文化而异。如果你在程序中转换成字符串,那很可能是问题所在。
  • 这不是sql server的设置吗?这取决于 sql server 的语言环境。我不完全确定。不确定 sql server 的区域设置和运行 .net 应用程序的机器之间的差异是否也会导致问题。但是,我给了你一些探索的途径。 :)
  • for different users i will get different time formats 实际上,不同的用户会看到相同日期时间的不同格式 - 除了存储日期之外不需要做任何事情。 theDate.ToString 将根据每个用户的本地设置显示日期。 VS 会以 your 本地格式显示日期。

标签: sql .net sql-server vb.net datetime


【解决方案1】:

大概您将 DateTime 值存储为 UTC 值(GetUTCDate()GetDate())。 理想情况下,如果您至少使用 SQL Server 2008,那么您的 SQL 字段类型应该使用 datetime2 而不是 datetime

如果您有一个本地时区的 DateTime 变量,您可以在将其存储到 SQL Server 之前使用 DateTime.ToUniversalTime 将其转换为 UTC:

dim localDateTime as DateTime
dim storedDateTime as DateTime
localDateTime = DateTime.Now
storedDateTime = localDateTime.ToUniversalTime()

另请注意链接的 MSDN 页面上有关 XP 的警告。

当您检索 UTC 值时,您可以使用 DateTime.ToLocalTime() 对本地机器的时区进行时区调整:

Dim storedDateTime as DateTime
Dim localDateTime as string
storedDateTime = (DateTime)reader[Timestamp"]
localDateTime = myDateTime.ToLocalTime()

要获得 DateTime 字符串的正确格式,您应该能够使用 DateTime.ToString()。这将使用线程的当前文化:

Console.WriteLine(localDateTime.ToString())

如果您愿意,可以通过specifying the culture 手动覆盖它:

Dim germanCultureInfo As New CultureInfo("de-DE")
Console.WriteLine(localDateTime.ToString(germanCultureInfo))

【讨论】:

    【解决方案2】:

    日期的显示是一个 UI 问题。从日期到文本和从文本到日期的转换应该在 UI 上使用用户当前的文化或通过TryParseExact 强制完成。

    所有业务逻辑和数据库都不应依赖于用户文化或时区。在您的情况下,最好将所有内容都存储为 UTC。

    如果您开始存储小时,您很快就会发现每个国家/地区拥有不同的 DLS 会变得多么混乱。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-15
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多