在本地化系统上解析DateTime

Ian*_*Ian 4 .net c# 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.

谢谢!

Edu*_*eni 6

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

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

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
Run Code Online (Sandbox Code Playgroud)

2.获取日期变量的输入

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

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

编辑

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