0

在我的 web.config 文件中,我有这一行:

<globalization culture="auto:en-GB" uiCulture="auto:en-GB" requestEncoding="utf-8" responseEncoding="utf-8" responseHeaderEncoding="utf-8"/>

ASP.Net 很好地处理了所有的日期/时间格式。在示例页面中应用以下代码...

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
    txt.Text = New DateTime(2010, 1, 25).ToString()
End Sub

Protected Sub btn_Click(sender As Object, e As EventArgs) Handles btn.Click
    Dim dt As DateTime = Convert.ToDateTime(txt.Text.Trim())
    Trace.Warn(dt.ToString())
End Sub

使用浏览器,设置为英语(英国),我看到日期显示为

25/01/2010 00:00:00

在按下按钮并将其转换回 DateTime 值时,它可以完美运行。

如果我将浏览器 (Chrome) 设置更改为挪威博克马尔,并加载页面,我会看到:

25.01.2010 00.00.00

这又是正确的,但是,如果我然后提交表单,ASP.Net 崩溃:

字符串未被识别为有效的日期时间。

第 9 行:Dim dt As DateTime = Convert.ToDateTime(txt.Text.Trim())

为什么会这样?当然,如果 ASP.Net 能够根据文化设置显示日期,它应该能够读取它们吗?我已经尝试过英语英国和英语美国,并且都按预期工作,加上其他人,所以它似乎在某种程度上与挪威语有关。

4

2 回答 2

2

终于找到了答案。这是 v4.0+ 的 .Net 框架中的一个错误。

Microsoft Connect 中已对此进行了报告,此处详细介绍了临时解决方法。显然这是与 Windows 10 严格相关的问题:

Windows 10 更改了某些文化的日期和时间格式设置。特别值得关注的是三个不同地区的七种文化:

  1. 芬兰
  2. 挪威博克马尔(“挪威”和“斯瓦尔巴和扬马延”变体)
  3. 塞尔维亚语(变体“西里尔语,科索沃”,“拉丁语,黑山”,“拉丁语,塞尔维亚”和“拉丁语,科索沃”)。

对于这七种文化,Windows 10 将日期和时间分隔符更改为相同。例如,在芬兰语中,标准日期格式曾经是 26.8.2015 21:08,而现在是 26.8.2015 21.08 – 请注意时间分隔符的细微变化。

在所有当前发布的 .NET 版本中,DateTime.Parse 方法都有一个缺点:在日期/时间分隔符是相同字符的区域性中,它总是无法解析日期或日期+时间组合。此错误与 Windows 10 的区域性更改一起打破了以前 DateTime.Parse 始终能够解析区域性的默认 DateTime 表示的硬性规则。现在, DateTime.Parse(DateTime.Now.ToString()) 在所述条件下不再起作用。DateTime.Parse(DateTime.Now.ToShortDateString()) 也没有,这有点违反直觉,因为甚至没有涉及更改的时间分隔符,但尽管如此 - 解析器认为它正在解析时间而不是日期。

官方补丁将于 2015 年 9 月发布。

于 2015-09-10T10:24:53.883 回答
0

使用Convert.ToDateTime(string, IFormatProvider)重载来指定CultureInfo要使用的。

于 2015-09-08T15:57:17.753 回答