如何标准化所有地区的日期时间格式?

时间:2014-07-30 15:04:19

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

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

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:1)

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

如果您在本地时区中有一个DateTime变量,则可以在使用DateTime.ToUniversalTime将其存储到SQL Server中之前将其转换为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))

答案 1 :(得分:0)

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

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

如果你开始存储小时,你会很快看到每个国家有不同的DLS会有多乱。