簡體   English   中英

C# - 如何在不改變日期時間格式的情況下改變文化

[英]C# - How to change culture without changing DateTime format

我已經在 ASP,net Web Form 中使用 Resx 文件在站點中實現多語言。 為了改變語言,我應該改變以下措施:

Thread.CurrentThread.CurrentCulture
Thread.CurrentThread.CurrentUICulture

似乎在 Microsoft Windows 10 等新操作系統中,更改 Culture 可能會以相同的方式更改 DateTime。 它給我們帶來了很多問題,例如:數據庫中DateTime的保存格式是Anno Domini,但它通過更改文化而改變並以其他格式保存在數據庫中。 我應該如何在不更改日期格式的情況下更改文化?

謝謝

我將以下代碼添加到母版頁的 OnLoad 以防止使用其他文化日歷

System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat = New CultureInfo("en-GB").DateTimeFormat

您應該使用CultureInfo類實現自定義文化,並從默認或自己的文化派生日期時間模式:

public static class PersianDateExtensionMethods
{
    private static CultureInfo _culture;

    public static CultureInfo GetPersianCulture()
    {
        const string cultureName = "fa-IR";

        if (_culture == null)
        {
            _culture = new CultureInfo(cultureName);

            DateTimeFormatInfo formatInfo = _culture.DateTimeFormat;

            formatInfo.AbbreviatedDayNames = new[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
            formatInfo.DayNames = new[] { "یکشنبه", "دوشنبه", "سه شنبه", "چهار شنبه", "پنجشنبه", "جمعه", "شنبه" };
            var monthNames = new[]
            {
                "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن",
                "اسفند",
                ""
            };
            formatInfo.AbbreviatedMonthNames = formatInfo.MonthNames = formatInfo.MonthGenitiveNames = formatInfo.AbbreviatedMonthGenitiveNames = monthNames;

            _culture.DateTimeFormat = new CultureInfo("en-US").DateTimeFormat;

            Calendar persianCalendar = new PersianCalendar();

            FieldInfo fieldInfo = _culture.GetType().GetField("calendar", BindingFlags.NonPublic | BindingFlags.Instance);
            if (fieldInfo != null)
                fieldInfo.SetValue(_culture, persianCalendar);

            FieldInfo info = formatInfo.GetType().GetField("calendar", BindingFlags.NonPublic | BindingFlags.Instance);
            if (info != null)
                info.SetValue(formatInfo, persianCalendar);

            _culture.NumberFormat.NumberDecimalSeparator = "/";
            _culture.NumberFormat.DigitSubstitution = DigitShapes.NativeNational;
            _culture.NumberFormat.NumberNegativePattern = 0;
        }
        return _culture;
    }
}

正如您在我們的自定義文化的代碼 DateTimeFormat 中看到的那樣,設置為“en-US”文化的日期時間格式,最后 _culture 變量包含一個新的文化,該文化適用於波斯語,但日期時間格式繼承自美國文化。

您需要配置服務以使用您的文化,如下所示:

CultureInfo.DefaultThreadCurrentCulture = CultureInfo.DefaultThreadCurrentUICulture =
            PersianDateExtensionMethods.GetPersianCulture();

我不知道您在何處更改代碼以滿足您的要求,但我希望此代碼可以為您提供解決問題的想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM