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

Вопрос:

в 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.

Ответы [ 2 ]

1 голос
/ 21 марта 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);
        }

    }
}
1 голос
/ 20 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...