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

Xamarin应用获取回历日期报错:HijriCalendar类型未找到

在Xamarin中获取回历日期的解决方案

你遇到的Error CS0246是因为Mono(Xamarin基于的.NET运行时)的System.Globalization命名空间并不包含HijriCalendar类——这个类在.NET Framework中存在,但Xamarin使用的Mono实现没有提供它,哪怕你添加了using System.Globalization也没用。下面给你几个可行的解决方案:

方案1:使用平台原生API(无第三方依赖)

Xamarin可以直接调用iOS和Android的原生日历API,这是最轻量化的方式,需要针对不同平台写特定代码,配合条件编译统一调用。

Android平台实现

Android的ICU库提供了完整的回历支持,直接使用Android.Icu.Util.HijriCalendar:

using Android.Icu.Util;
using Android.Icu.Text;

// 获取当前回历日期
var hijriCalendar = new HijriCalendar();
// 注意:Android的月份从0开始,所以要+1
int hijriYear = hijriCalendar.Get(CalendarField.Year);
int hijriMonth = hijriCalendar.Get(CalendarField.Month) + 1;
int hijriDay = hijriCalendar.Get(CalendarField.DayOfMonth);

// 格式化输出示例(比如"1445/03/15")
var formatter = new SimpleDateFormat("yyyy/MM/dd", Locale.Default);
formatter.Calendar = hijriCalendar;
string hijriDateString = formatter.Format(Java.Util.Calendar.Instance.Time);

iOS平台实现

iOS通过NSCalendar指定回历标识符来获取日期:

using Foundation;

// 初始化伊斯兰教民用历(最常用的回历类型)
var hijriCalendar = new NSCalendar(NSCalendarIdentifier.IslamicCivil);
var currentDate = NSDate.Now;

// 获取年、月、日组件
var dateComponents = hijriCalendar.GetComponent(
    NSCalendarUnit.Year | NSCalendarUnit.Month | NSCalendarUnit.Day, 
    currentDate);

int hijriYear = (int)dateComponents.Year;
int hijriMonth = (int)dateComponents.Month;
int hijriDay = (int)dateComponents.Day;

// 格式化输出示例
var dateFormatter = new NSDateFormatter();
dateFormatter.Calendar = hijriCalendar;
dateFormatter.DateFormat = "yyyy/MM/dd";
string hijriDateString = dateFormatter.StringFromDate(currentDate);

跨平台统一调用(条件编译)

在共享项目中可以用条件编译封装成统一方法:

public static (int Year, int Month, int Day) GetCurrentHijriDate()
{
#if __ANDROID__
    var hijriCalendar = new Android.Icu.Util.HijriCalendar();
    return (
        hijriCalendar.Get(Android.Icu.Util.CalendarField.Year),
        hijriCalendar.Get(Android.Icu.Util.CalendarField.Month) + 1,
        hijriCalendar.Get(Android.Icu.Util.CalendarField.DayOfMonth)
    );
#elif __IOS__
    var hijriCalendar = new NSCalendar(NSCalendarIdentifier.IslamicCivil);
    var components = hijriCalendar.GetComponent(
        NSCalendarUnit.Year | NSCalendarUnit.Month | NSCalendarUnit.Day, 
        NSDate.Now);
    return ((int)components.Year, (int)components.Month, (int)components.Day);
#else
    throw new NotImplementedException("当前平台不支持回历获取");
#endif
}

方案2:使用跨平台第三方库(NodaTime)

如果不想写平台专属代码,推荐使用NodaTime——这是一个专业的.NET日期时间库,完美支持各种日历系统,跨平台兼容Xamarin。

  1. 先在你的Xamarin项目中通过NuGet安装NodaTime包;
  2. 然后用以下代码获取回历日期:
using NodaTime;
using NodaTime.Calendars;

// 获取当前系统时间对应的回历日期
var currentInstant = SystemClock.Instance.GetCurrentInstant();
// 转换为当前时区的本地日期
var localDateTime = currentInstant.InZone(DateTimeZoneProviders.Tzdb.GetSystemDefault());
// 指定使用伊斯兰教民用历
var hijriCalendar = CalendarSystem.GetIslamicCalendar(IslamicCalendarType.Civil);
// 转换为回历日期
var hijriDate = localDateTime.Date.WithCalendar(hijriCalendar);

int hijriYear = hijriDate.Year;
int hijriMonth = hijriDate.Month;
int hijriDay = hijriDate.Day;

// 格式化输出示例
var formatter = new LocalDatePattern("yyyy/MM/dd", hijriCalendar);
string hijriDateString = formatter.Format(hijriDate);

内容的提问来源于stack exchange,提问作者Jassim Al Rahma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:30:08