我们有一个生成报告的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。
谢谢!
答案 0 :(得分:6)
您绝不应在数据库中存储本地化的日期字符串。
您必须将日期存储在日期列中,然后在显示数据时对其进行本地化。
此示例根据请求路径设置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
从文本输入中获取数据很简单,这是一个示例,但使用日期验证器,您应该没问题。
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日。
答案 1 :(得分:3)
在数据库中,如果必须将其存储为文本,则应标准化格式。但更好的是,将其存储为datetime
,并且无需解析 - 只需将其作为日期从数据库中读出来......
如果您有字符串,请在解析时使用已知文化(可能是不变文化):
DateTime when = DateTime.Parse(s, CultureInfo.InvariantCulture);
答案 2 :(得分:1)
说实话,你需要:
DateTime
,没有您的代码执行任何转换)。DateTime.ParseExact
并明确指定格式字符串来使用预期的格式。答案 3 :(得分:0)
这真的取决于RDBMS。 查看您是否可以使数据库在不变文化或您选择的特定(不变)文化中存储日期,然后为CultureInfo
方法提供正确的DateTime.Parse()
。罢工>这似乎不再是一个选项,因为你无法控制存储日期。
你必须看看你是否可以弄清楚它是如何存储日期并采取相应行动的。检查俄罗斯系统的操作系统设置;也许有人从默认值改变它,数据库是相应的反应?如果是这样,你可能会以同样的方式作出反应。
否则,您需要在系统和日期存储方式之间建立一些关联。如果所有俄罗斯系统以相同的方式存储它,您可以打开当前文化并使用ParseExact
。虽然感觉有点像黑客,但我不确定你还有其他选择。
答案 4 :(得分:0)
听起来您的问题与您的数据库有关。
在Windows上你应该: - 检查数据源的区域设置, - 您的数据连接字符串, - 或更改RDBMS上用户的默认语言。
其中每一项都可以确保以正确的格式返回您的数据。
解决方案的确切细节当然取决于您正在与之交谈的数据库以及您正在使用的操作系统。