在我的程序中,我将当前时间插入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"))
我一直试图弄清楚如何在插入服务器之前标准化这种格式,没有任何运气。 希望有人可以提供帮助。
谢谢!
答案 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会有多乱。