You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android DatePicker自定义波斯历月份名称问题求助

解决Android DatePicker显示波斯历月份名称的问题

看起来你遇到的核心问题是:.NET的CultureInfo设置并不会直接作用于原生Android控件(比如DatePicker),因为这些控件依赖的是Android系统的Locale而非.NET的文化设置。另外,你代码里直接用波斯历的年份创建DateTime对象也存在错误,因为DateTime本身是基于公历的,这样会导致日期转换出错。下面是具体的解决步骤:

1. 切换Android系统Locale为波斯语(fa-IR)

原生Android控件的本地化由系统Locale控制,所以先在你的OnCreate方法中设置应用的Locale:

public override void OnCreate(Bundle savedInstanceState)
{
    // 设置Android系统Locale为波斯语(伊朗)
    var persianLocale = new Java.Util.Locale("fa", "IR");
    Java.Util.Locale.Default = persianLocale;
    
    var config = new Android.Content.Res.Configuration();
    config.SetLocale(persianLocale);
    Resources.UpdateConfiguration(config, Resources.DisplayMetrics);

    base.OnCreate(savedInstanceState);
    // 其他初始化代码...
}

2. 修正波斯历与公历的日期转换

你之前直接用波斯历年份创建DateTime的方式是错误的,因为DateTime默认是公历。需要用PersianCalendar将波斯历日期转换为公历DateTime,再设置给DatePicker:

PersianCalendar persianCalendar = new PersianCalendar();
DatePicker calObj = new DatePicker(FrContext);

// 转换波斯历1300/1/1为公历DateTime
DateTime minGregorian = persianCalendar.ToDateTime(1300, 1, 1, 0, 0, 0, 0);
DateTimeOffset minDateOffset = new DateTimeOffset(minGregorian);
calObj.MinDate = minDateOffset.ToUnixTimeMilliseconds();

// 转换波斯历1500/1/1为公历DateTime
DateTime maxGregorian = persianCalendar.ToDateTime(1500, 1, 1, 0, 0, 0, 0);
DateTimeOffset maxDateOffset = new DateTimeOffset(maxGregorian);
calObj.MaxDate = maxDateOffset.ToUnixTimeMilliseconds();

// 设置当前日期:先获取当前日期的波斯历年月日,再转成公历DateTime
DateTime now = DateTime.Now;
int persianYear = persianCalendar.GetYear(now);
int persianMonth = persianCalendar.GetMonth(now);
int persianDay = persianCalendar.GetDayOfMonth(now);
DateTime currentGregorian = persianCalendar.ToDateTime(persianYear, persianMonth, persianDay, 0, 0, 0, 0);
calObj.DateTime = currentGregorian;

3. 强制自定义月份显示(如果Locale设置后仍不生效)

有些情况下,即使设置了Locale,DatePicker的月份选择器可能还是不会显示自定义的波斯语月份名称。这时可以直接找到DatePicker中的月份NumberPicker控件,替换它的显示值:

// 找到DatePicker内部的月份NumberPicker
var monthPicker = calObj.FindViewById<NumberPicker>(Resources.GetIdentifier("month", "id", "android"));
if (monthPicker != null)
{
    // 波斯历月份名称数组
    string[] persianMonths = new string[] { 
        "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", 
        "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند" 
    };
    monthPicker.DisplayedValues = persianMonths;
    // Android的DatePicker月份范围是0-11,对应波斯历的1-12,所以设置Min/MaxValue
    monthPicker.MinValue = 0;
    monthPicker.MaxValue = 11;
}

4. 最后显示对话框

剩下的对话框代码可以保持不变:

AlertDialog.Builder aaa = new AlertDialog.Builder(FrContext);
aaa.SetView(calObj);
aaa.Show();

这样调整后,你的DatePicker应该就能正确显示波斯历的月份名称,并且日期范围和当前日期也会基于波斯历正确转换。

内容的提问来源于stack exchange,提问作者user6498197

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:59:58