将公历转回历时遇System.FormatException错误求助
解决公历转回历时的FormatException问题
咱们先拆解下你代码里的几个问题,尤其是导致报错的核心原因:
你代码里的问题点
- 语法错误:
DateTime dt = 1/6/2018 12:00:00 AM;这行写法不对,C#里不能直接这么声明日期,得用new DateTime(2018, 1, 6)来实例化公历日期对象。 - 多余的解析步骤:
DateTime.Parse(dt.ToString())完全没必要,dt本身就是DateTime类型,直接用就行,绕这一圈纯属画蛇添足。 - 核心报错原因:你用绑定了UmAlQura日历的
ar-SA文化去调用ParseExact,解析公历格式的字符串"1/6/2018"——这时候ParseExact会默认把输入的字符串当成回历日期来处理,但回历的年份目前才到144x左右,2018这个年份在回历里是无效的,自然就抛出FormatException了。
正确的实现方式
根据你的需求(把公历日期转成回历日期),分两种场景给你正确代码:
场景1:已有公历DateTime对象,直接转成回历日期字符串
// 先实例化你要转换的公历日期(2018年1月6日) DateTime gregorianDate = new DateTime(2018, 1, 6); // 创建沙特阿拉伯文化,并指定使用UmAlQura回历 CultureInfo arSA = new CultureInfo("ar-SA"); arSA.DateTimeFormat.Calendar = new UmAlQuraCalendar(); // 将公历日期格式化为回历字符串(这里用dd/MM/yyyy格式,你可以按需调整) string hijriDateString = gregorianDate.ToString("dd/MM/yyyy", arSA); // 输出示例:"27/09/1439"(对应公历2018年1月6日的回历日期)
场景2:从公历日期字符串开始,先解析再转成回历
如果你是从字符串"1/6/2018"开始处理,要先把它解析成公历DateTime,再转成回历:
string gregorianDateStr = "1/6/2018"; string gregorianFormat = "M/dd/yyyy"; // 先解析为公历DateTime(用InvariantCulture确保解析逻辑不受系统区域影响) DateTime gregorianDate = DateTime.ParseExact(gregorianDateStr, gregorianFormat, CultureInfo.InvariantCulture); // 同上,转成回历字符串 CultureInfo arSA = new CultureInfo("ar-SA"); arSA.DateTimeFormat.Calendar = new UmAlQuraCalendar(); string hijriDateString = gregorianDate.ToString("dd/MM/yyyy", arSA);
额外补充:如果要解析回历字符串为DateTime
要是你反过来想把回历字符串转成DateTime,那才需要用ar-SA文化去ParseExact,但输入得是有效的回历日期:
string hijriDateStr = "27/09/1439"; string hijriFormat = "dd/MM/yyyy"; CultureInfo arSA = new CultureInfo("ar-SA"); arSA.DateTimeFormat.Calendar = new UmAlQuraCalendar(); // 解析回历字符串为DateTime(这个DateTime内部还是公历,但绑定了回历文化) DateTime hijriDate = DateTime.ParseExact(hijriDateStr, hijriFormat, arSA);
总结一下
你之前的错误是搞混了「解析日期字符串」和「转换日期格式」的逻辑:用回历文化去解析公历格式的字符串,自然会因为年份无效报错。正确的思路是先拿到正确的公历DateTime,再用回历文化把它格式化成回历日期字符串就行。
内容的提问来源于stack exchange,提问作者AbdulAziz
相关产品推荐
相关产品推荐

