1

質問:

セクションの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")

例外をスローします

残念ながら、私の開発システムではなく、テストサーバーでのみです。webapp を 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

このように Page_Load の最初で de-ch する

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

その後、正常に動作します。

ブラウザの言語が「de-ch」に設定されていることを確認しました。

thread-culture が English に設定される理由を誰か教えてもらえますか?

明らかな理由は、サーバーのオペレーティング システムが英語であることですが、それを変更することはできません。web.config の設定のみです。

4

2 に答える 2

1

私はあなたと同じ経験をしていますが、web.configのグローバリゼーションタグは単に無視されているようです。しかし、常にde-chカルチャで日付を解析したいので、DateTime.Parseメソッドにカルチャを提供するだけで何が問題になるのかわかりません(いくつかのガイドラインでは、これがとにかく行うのが最善であると述べています)

于 2012-03-20T13:44:07.167 に答える
1

問題は、明示的に指定した場合でも、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);
        }

    }
}
于 2012-03-21T09:18:26.673 に答える