You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将波斯历日期字符串转换为波斯历格式DateTime?代码问题咨询

如何把回历(波斯历)时间字符串转成波斯历格式的DateTime?

嘿,我来给你掰扯清楚这个事儿!首先你得明白一个关键点:.NET里的DateTime对象本身是基于公历的,它内部存的就是公历的时间戳,并不绑定任何特定日历。你说的“得到波斯历格式的DateTime”,其实本质是要能正确获取或展示这个时间对应的波斯历年月日时分,而不是改变DateTime的底层存储逻辑。

先看你的原代码:你已经用PersianCalendar创建了DateTime,这个ConvertedDate其实已经正确对应了你输入的波斯历时间,只是DateTime自身的Year/Month/Day属性默认返回的是公历的数值而已。

下面给你两种解决方案,看你需求选:

方案1:保留DateTime对象,用PersianCalendar读取波斯历字段

如果后续需要操作这个时间的波斯历信息,完全可以用原代码创建DateTime,然后用PersianCalendar来读取对应的字段,而不是直接用DateTime的属性:

// 调用你的方法得到DateTime
DateTime convertedDate = Convert_String_To_DateTime("1403/05/10", "14:30");
PersianCalendar pc = new PersianCalendar();

// 获取波斯历的年月日时分
int persianYear = pc.GetYear(convertedDate);
int persianMonth = pc.GetMonth(convertedDate);
int persianDay = pc.GetDayOfMonth(convertedDate);
int persianHour = pc.GetHour(convertedDate);
int persianMinute = pc.GetMinute(convertedDate);

方案2:修改方法直接返回波斯历格式的字符串

如果你希望方法直接返回一看就是波斯历格式的字符串(而不是DateTime对象),可以调整代码,把DateTime对应的波斯历字段拼接成字符串返回:

public static string Convert_String_To_PersianDateTimeString(string PersianDate, string Time)
{
    PersianCalendar pc = new PersianCalendar();
    int year = Convert.ToInt32(PersianDate.Substring(0, PersianDate.IndexOf('/')));
    int month = Convert.ToInt32(PersianDate.Substring(PersianDate.IndexOf('/') + 1, 2));
    int day = Convert.ToInt32(PersianDate.Substring(PersianDate.IndexOf('/') + 4, 2));
    int hour = Convert.ToInt32(Time.Substring(0, Time.IndexOf(':')));
    int min = Convert.ToInt32(Time.Substring(Time.IndexOf(':') + 1));
    
    // 创建对应的DateTime(内部是公历,但映射关系正确)
    DateTime convertedDate = new DateTime(year, month, day, hour, min, 0, pc);
    
    // 用PersianCalendar重新获取波斯历字段,拼接成标准格式的字符串
    return $"{pc.GetYear(convertedDate)}/{pc.GetMonth(convertedDate):00}/{pc.GetDayOfMonth(convertedDate):00} {pc.GetHour(convertedDate):00}:{pc.GetMinute(convertedDate):00}";
}

额外优化:更健壮的解析方式

你的原代码手动截取字符串的方式有风险,如果输入的日期格式不严格是yyyy/mm/dd(比如单月/单日没有前导零),很容易报错。推荐用DateTime.ParseExact配合波斯文化来解析,更靠谱:

public static DateTime Convert_String_To_DateTime(string PersianDate, string Time)
{
    string fullDateTimeStr = $"{PersianDate} {Time}";
    // 用波斯文化(fa-IR)的默认日历(波斯历)来解析字符串
    DateTime convertedDate = DateTime.ParseExact(fullDateTimeStr, "yyyy/MM/dd HH:mm", CultureInfo.GetCultureInfo("fa-IR"));
    return convertedDate;
}

这种方式不需要手动截取字符串,容错性更强,解析出来的DateTime同样对应正确的时间点,后续用PersianCalendar读取字段就能拿到波斯历的信息。

内容的提问来源于stack exchange,提问作者s.g

火山引擎 最新活动