DateTime.Parse с использованием культуры en-us, несмотря на настройку web.config

Вопрос:

в web.config в разделе

system.web

у меня есть

<globalization culture="de-ch" uiCulture="de-ch" requestEncoding="UTF-8" responseEncoding="UTF-8"/>

Я хочу разобрать такую ​​строку

"20.03.2012 00:00:00"

к значению даты и времени

но

DateTime dtAsIs = DateTime.Parse("20.03.2012 00:00:00")

выдает исключение

К сожалению, только на тестовом сервере, а не в моей системе разработки. У меня нет доступа к тестовому серверу, кроме как скопировать веб-приложение в общий ресурс Windows.

Я могу воспроизвести исключение следующим образом:

DateTime dtThrowsException = DateTime.Parse("20.03.2012 00:00:00",new System.Globalization.CultureInfo("en-us"));

В то время как он отлично работает следующим образом:

DateTime dtWorks = DateTime.Parse("20.03.2012 00:00:00",new System.Globalization.CultureInfo("de-ch"));

Я проверил страницу ASP, и на странице asp НЕТ культуры.

(Я имею в виду это:

<% @Page Culture="fr-FR" Language="C#" %>

)

Если я установлю

System.Threading.Thread.CurrentThread.CurrentCulture

и

System.Threading.Thread.CurrentThread.CurrentUICulture

для de-ch в самом начале Page_Load вот так

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de-ch");
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("de-ch");

тогда он работает нормально.

Язык браузера установлен на "de-ch", это я проверил.

Может ли кто-нибудь сказать мне, почему культура потоков устанавливается на английский язык?

Я имею в виду, что очевидная причина в том, что операционная система сервера английская, но я не могу изменить ее, только настройки в web.config.


person Stefan Steiger    schedule 20.03.2012    source источник


Ответы (2)


У меня такой же опыт, как и у вас, кажется, что тег глобализации в web.config просто игнорируется. Но поскольку вы всегда хотите анализировать даты в культуре de-ch, я не вижу ничего плохого в том, чтобы просто предоставить культуру методу DateTime.Parse (в некоторых рекомендациях говорится, что это лучше всего сделать в любом случае)

person Hanno    schedule 20.03.2012
comment
Проблема в том, что у меня нет времени, чтобы заменить его везде (всего от 1000 до 10 000 вхождений, распределенных по широкому кругу страниц и шаблонов...). Прямо сейчас я пытаюсь исправить это, наследуя от пользовательской страницы и устанавливая CurrentCulture перед OnInit там. - person Stefan Steiger; 20.03.2012
comment
Он по-прежнему игнорировал его, когда я устанавливал культуру в Date.Parse. Но теперь у меня есть решение... Смотрите мой ответ. - person Stefan Steiger; 21.03.2012

Проблема заключается в том, что ASP.NET перезаписывает культуру, даже если вы явно указываете ее. (Нравится

DateTime.Parse("Whatever", New System.Globalization.CultureInfo("de-ch"))

)

нужно принудительно переопределить его

 New System.Globalization.CultureInfo("de-ch", False)




Итак, чтобы сделать его настраиваемым и изменить как можно меньше, вам нужно получить культуру из web.config с помощью

System.Globalization.CultureInfo.CurrentCulture.Name

а затем принудительно установите его с помощью

 DateTime.Parse("Whatever", New System.Globalization.CultureInfo(System.Globalization.CultureInfo.CurrentCulture.Name, False))

Обратите внимание на перегрузку с помощью false, это необходимо, иначе это не сработает.

Вот мое решение:

Namespace ASP.NET.Sucks
    Public Class PageWithCorrectPageCulture
        Inherits Web.UI.Page

        Protected Sub New()
            System.Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo(System.Globalization.CultureInfo.CurrentCulture.Name, False)
            System.Threading.Thread.CurrentThread.CurrentUICulture = New System.Globalization.CultureInfo(System.Globalization.CultureInfo.CurrentCulture.Name, False)
        End Sub

    End Class
End Namespace

Затем в отделенном коде замените System.Web.UI.Page на PageWithCorrectPageCulture.

Partial Class whateverpage
    Inherits PageWithCorrectPageCulture
    'Inherits System.Web.UI.Page

И для тех, кто умеет только копировать C#:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
namespace ASP.NET.Sucks
{
    public class PageWithCorrectPageCulture : Web.UI.Page
    {

        protected PageWithCorrectPageCulture()
        {
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(System.Globalization.CultureInfo.CurrentCulture.Name, false);
            System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(System.Globalization.CultureInfo.CurrentCulture.Name, false);
        }

    }
}
person Stefan Steiger    schedule 21.03.2012
comment
Вместо того, чтобы устанавливать это на каждой странице, вы можете установить Begin_Request в Global.asax.cs, и это будет работать одинаково. - person Aaron D; 18.03.2013