为了账号安全,请及时绑定邮箱和手机立即绑定

不是给定 culture.parameter 名称的有效日历:

不是给定 culture.parameter 名称的有效日历:

C#
炎炎设计 2022-12-24 13:38:16
DataGridView我在将日期显示为波斯日历时遇到问题。使用此代码后:using System.Globalization;using System.Threading;...CultureInfo info = new CultureInfo("fa-Ir"){    DateTimeFormat = {Calendar = new PersianCalendar()}};Thread.CurrentThread.CurrentCulture = info;我的问题已解决,我的 PC 或笔记本电脑都没有问题,都是 Windows 10 和.netFramwork 4.8我的装有 Windows 7 的客户 PC 只有 Culture 有问题。这是为什么?异常消息: 不是给定区域性的有效日历。参数名称:值
查看完整描述

2 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

根据 Rasool Aghajani 的回答,我实现了一个新的 CultureInfo 类,您可以将其设置为应用程序的默认文化,并且所有日期时间都将采用波斯文化格式。


using System;

using System.Globalization;

using System.Reflection;


namespace SomeNamespace

{

    public class PersianCulture : CultureInfo

    {

        public PersianCulture() : base("fa-IR")

        {

            if (this.Calendar is PersianCalendar)

                return;


            //do hack here to set the default culture's calendar to PersianCalender on OS versions that are not supporting PersianCalendar as default culture calendar

            var dateTimeFormat = this.DateTimeFormat;


            dateTimeFormat.AMDesignator = "قبل‌ازظهر";

            dateTimeFormat.AbbreviatedDayNames = new string[] { "یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };

            dateTimeFormat.AbbreviatedMonthGenitiveNames = new string[] { "فروردین", "ارديبهشت", "خرداد", "تير", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };

            dateTimeFormat.AbbreviatedMonthNames = new string[] { "فروردین", "ارديبهشت", "خرداد", "تير", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };

            dateTimeFormat.CalendarWeekRule = CalendarWeekRule.FirstDay;

            dateTimeFormat.DateSeparator = "/";

            dateTimeFormat.DayNames = new string[] { "یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };

            dateTimeFormat.FirstDayOfWeek = DayOfWeek.Saturday;

            dateTimeFormat.FullDateTimePattern = "yyyy MMMM d, dddd H:mm:ss";

            dateTimeFormat.LongDatePattern = "yyyy MMMM d, dddd";

            dateTimeFormat.LongTimePattern = "H:mm:ss";

            dateTimeFormat.MonthDayPattern = "MMMM d";

            dateTimeFormat.MonthGenitiveNames = new string[] { "فروردین", "ارديبهشت", "خرداد", "تير", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };

            dateTimeFormat.MonthNames = new string[] { "فروردین", "ارديبهشت", "خرداد", "تير", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };

            dateTimeFormat.PMDesignator = "بعدازظهر";

            dateTimeFormat.ShortDatePattern = "yyyy/M/d";

            dateTimeFormat.ShortTimePattern = "H:mm";

            dateTimeFormat.ShortestDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };

            dateTimeFormat.TimeSeparator = ":";

            dateTimeFormat.YearMonthPattern = "yyyy MMMM";


            var persianCalendar = new PersianCalendar();


            var dateTimeFormatInfoCalendar = typeof(DateTimeFormatInfo).GetField("calendar", BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);


            dateTimeFormatInfoCalendar?.SetValue(dateTimeFormat, persianCalendar);


            var cultureTableRecord = typeof(DateTimeFormatInfo).GetField("m_cultureTableRecord", BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);

            if (cultureTableRecord != null)

            {

                var dateTimeFormatValue = cultureTableRecord.GetValue(dateTimeFormat);


                var useCurrentCalendarMethodInfo = dateTimeFormatValue.GetType().GetMethod("UseCurrentCalendar", BindingFlags.NonPublic | BindingFlags.Instance);

                if (

                    useCurrentCalendarMethodInfo !=

                    null)

                {

                    var persianCalendarIdPropertyInfo = persianCalendar.GetType().GetProperty("ID", BindingFlags.Instance | BindingFlags.NonPublic);

                    if (

                        persianCalendarIdPropertyInfo !=

                        null)

                        useCurrentCalendarMethodInfo.Invoke(dateTimeFormatValue, new object[] { persianCalendarIdPropertyInfo.GetValue(persianCalendar, null) });

                }

            }


            var cultureCalendar = typeof(CultureInfo).GetField("calendar", BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);

            cultureCalendar?.SetValue(this, persianCalendar);


            this.DateTimeFormat = dateTimeFormat;

        }

    }

}



查看完整回答
反对 回复 2022-12-24
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

我确实用这个替换了我的旧代码:


        System.Globalization.CultureInfo calture = new System.Globalization.CultureInfo("fa-Ir");

        System.Globalization.DateTimeFormatInfo info = calture.DateTimeFormat;

        info.AbbreviatedDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };

        info.DayNames = new string[] { "یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };

        info.AbbreviatedMonthNames = new string[] { "فروردین", "ارديبهشت", "خرداد", "تير", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };

        info.MonthNames = new string[] { "فروردین", "ارديبهشت", "خرداد", "تير", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };

        info.AMDesignator = "ق.ظ";

        info.PMDesignator = "ب.ظ";

        info.ShortDatePattern = "yyyy/MM/dd";

        info.FirstDayOfWeek = DayOfWeek.Saturday;

        System.Globalization.PersianCalendar cal = new System.Globalization.PersianCalendar();


        var field = typeof(System.Globalization.DateTimeFormatInfo).GetField("calendar", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);

        field?.SetValue(info, cal);

        var fieldInfo = typeof(System.Globalization.DateTimeFormatInfo).GetField("m_cultureTableRecord", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);

        if (fieldInfo != null)

        {

            object obj = fieldInfo.GetValue(info);

            var methodInfo = obj.GetType().GetMethod("UseCurrentCalendar", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

            if (

                methodInfo !=

                null)

            {

                var propertyInfo = cal.GetType().GetProperty("ID", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);

                if (

                    propertyInfo !=

                    null)

                    methodInfo.Invoke(obj, new object[] { propertyInfo.GetValue(cal, null) });

            }

        }

        var field1 = typeof(System.Globalization.CultureInfo).GetField("calendar", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);

        field1?.SetValue(calture, cal);

        var fieldInfo1 = typeof(System.Globalization.CultureInfo).GetField("calendar", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);

        fieldInfo1?.SetValue(calture, cal);


        System.Threading.Thread.CurrentThread.CurrentCulture = calture;

        System.Threading.Thread.CurrentThread.CurrentUICulture = calture;

        System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat = info;

        System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat = info;

它在所有计算机上都工作得很好......但我不知道......如果某些代码是真的应该在所有计算机上工作!否则如果有问题不应该在任何计算机上工作......


查看完整回答
反对 回复 2022-12-24
  • 2 回答
  • 0 关注
  • 100 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号