在本地化系统上解析DateTime

我们有一个生成报告的Web应用程序。 数据来自数据库。

当我们在本地化系统上运行Web应用程序时,它会爆炸。 我们在DateTime.Parse(dateString)上追踪了这个问题; 呼叫。

存储在数据库中的日期在某种程度上取决于计算机的区域设置。

在英语系统中,日期存储为MM / DD / YYYY(06/25/2009),这是完全正常的。

在俄罗斯系统上,日期存储为MM.DD.YYYY(06.25.2009)。 这很奇怪,因为俄罗斯系统中短日期格式的默认设置(我选中)是dd.MM.yyyyy ……所以它应该是25.06.2009。 我不明白为什么它接受了默认的分隔符(。)而不是默认的日期格式。

所以,无论如何,我如何在本地化系统上解析日期字符串? 如果我使用俄罗斯文化信息,它仍会抛出错误,因为它期待dd.MM.yyyyy。

谢谢!

您永远不应该在数据库中存储本地化的日期字符串。

您必须将日期存储在日期列中,然后在显示数据时对其进行本地化。

1.设置站点UI的区域设置

此示例根据请求路径设置lang,但可能具有其他机制。

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs) Dim lang As String If HttpContext.Current.Request.Path.Contains("/en/") Then lang = "en" 'english' ElseIf HttpContext.Current.Request.Path.Contains("/pt/") Then lang = "pt" 'portugues' Else lang = "es" 'español, the default for the site' End If Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang) Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang) End Sub 

2.获取日期变量的输入

从文本输入中获取数据很简单,这是一个示例,但使用日期validation器,您应该没问题。

 dim theDate as date if IsDate( txtDate.text ) then theDate = DateTime.Parse(txtDate.text) else 'throw exception or something end if 

编辑

既然你说你不能改变它的存储方式,你就会遇到大麻烦,除非你在db记录中有某种方式来告诉日期的格式。 问题不在于分隔符,但是当你找到像6/3/2009这样的日期时,你不知道它是3月6日还是6月3日。

在数据库中,如果必须将其存储为文本,则应标准化格式。 但更好的是,将它存储为datetime ,并且没有什么可以解析 – 只需将其作为日期从数据库中读出来……

如果您有一个字符串,请在解析时使用已知文化(可能是不变文化):

 DateTime when = DateTime.Parse(s, CultureInfo.InvariantCulture); 

说实话,你需要:

  • 了解数据库中的预期格式。 如果可能的话,将其作为字符串的单个标准格式,或者最好是数据库中的日期/时间类型(然后您可以将其作为 DateTime从数据库中读取,而不需要代码执行任何转换)。
  • 通过调用DateTime.ParseExact并显式指定格式字符串来使用预期的格式。

这真的取决于RDBMS。 看看你是否可以让数据库在不变文化或你选择的特定(不变)文化中存储日期,然后向DateTime.Parse()方法提供正确的CultureInfo 这似乎不再是一个选项,因为您无法控制存储日期。

你必须看看你是否可以弄清楚它是如何存储日期并采取相应行动的。 检查俄罗斯系统的操作系统设置; 也许有人从默认值中更改了它,数据库会相应地做出反应? 如果是这样,你可能会以同样的方式作出反应。

否则,您需要在系统和日期存储方式之间建立一些关联。 如果所有俄罗斯系统以相同的方式存储它,您可以打开当前的文化并使用ParseExact 。 感觉有点像黑客,但我不确定你有另一种选择。

听起来您的问题与您的数据库有关。

在Windows上,您应该: – 检查数据源的区域设置, – 数据的连接字符串, – 或更改RDBMS上用户的默认语言。

其中每个都可以确保以正确的格式返回您的数据。

解决方案的确切细节当然取决于您正在与之交谈的数据库以及您正在使用的操作系统。