如何在C#中以波斯语格式打印DateTime

29

如何以波斯语打印C# DateTime的最简单方法?我目前正在使用:

static public string PersianDateString(DateTime d)
{
    CultureInfo faIR = new CultureInfo("fa-IR");
    faIR.DateTimeFormat.Calendar = new PersianCalendar();            
    return d.ToString("yyyy/MM/dd", faIR);
}

会抛出一个异常

对于给定的文化不是一个有效的日历

5个回答

40

首先,您必须注意,无法将Jalali日期放入DateTime对象中,在类似于“1392/02/31”这样的日期中,会出现异常。

因此,您必须将Jalali日期处理为字符串或自定义的DateTime类型。

我建议您始终将日期保留为公历日期,并在需要显示时进行转换。

这是一个从DateTime对象获取波斯日期的扩展方法。

    public static string GetPersianDate(this DateTime date)
    {
        PersianCalendar jc = new PersianCalendar();
        return string.Format("{0:0000}/{1:00}/{2:00}", jc.GetYear(date), jc.GetMonth(date), jc.GetDayOfMonth(date));
    }
    //How to use it:
    DateTime d = new DateTime(2014, 05, 21);
    string s = d.GetPersianDate(); //1393/02/31

如果你有一个带字符串格式的波斯历日期,这是获取公历日期的扩展方法:

    public static DateTime GetDateTimeFromJalaliString(this string jalaliDate)
    {
        PersianCalendar jc = new PersianCalendar();

        try
        {
            string[] date = jalaliDate.Split('/');
            int year = Convert.ToInt32(date[0]);
            int month = Convert.ToInt32(date[1]);
            int day = Convert.ToInt32(date[2]);

            DateTime d = jc.ToDateTime(year, month, day, 0, 0, 0, 0, PersianCalendar.PersianEra);

            return d;
        }
        catch
        {
            throw new FormatException("The input string must be in 0000/00/00 format.");
        }
    }
    //How to use it:
    string pdate = "1392/02/31";
    DateTime dateFromJalali = pdate.GetDateTimeFromJalaliString(); //{5/21/2014 12:00:00 AM}

现在处理额外的功能:

星期名称:

    public static string GetDayOfWeekName(this DateTime date)
    {
        switch (date.DayOfWeek)
        {
            case DayOfWeek.Saturday: return "شنبه";
            case DayOfWeek.Sunday: return "يکشنبه";
            case DayOfWeek.Monday: return "دوشنبه";
            case DayOfWeek.Tuesday: return "سه‏ شنبه";
            case DayOfWeek.Wednesday: return "چهارشنبه";
            case DayOfWeek.Thursday: return "پنجشنبه";
            case DayOfWeek.Friday: return "جمعه";
            default: return "";
        }
    }
    //How to use it:
    DateTime date = DateTime.Now;
    string wname = date.GetDayOfWeekName();

月份名称:

    public static string GetMonthName(this DateTime date)
    {
            PersianCalendar jc = new PersianCalendar();
            string pdate = string.Format("{0:0000}/{1:00}/{2:00}", jc.GetYear(date), jc.GetMonth(date), jc.GetDayOfMonth(date));

            string[] dates = pdate.Split('/');
            int month = Convert.ToInt32(dates[1]);

            switch (month)
            {
                case 1: return "فررودين";
                case 2: return "ارديبهشت";
                case 3: return "خرداد";
                case 4: return "تير‏";
                case 5: return "مرداد";
                case 6: return "شهريور";
                case 7: return "مهر";
                case 8: return "آبان";
                case 9: return "آذر";
                case 10: return "دي";
                case 11: return "بهمن";
                case 12: return "اسفند";
                default: return "";
            }

    }
    //How to use it:
    DateTime date = DateTime.Now;
    string mname = date.GetMonthName();

13

可以试试这样:

public static string PersianDateString(DateTime d)
{
    CultureInfo faIR = new CultureInfo("fa-IR");
    return d.ToString("yyyy/MM/dd", faIR);
}

如果您将格式更改为例如"yyyy MMM ddd",您将获得2011 جوييه الأحد


1
最重要的是它不能打印波斯语的星期和月份名称,只能打印阿拉伯语名称。波斯语的月份名称是 فروردین - اردیبهشت - خرداد 等,而波斯语的星期名称是 شنبه - یکشنبه 等。这完全没有用处。 - QMaster
我在我的电脑上测试了这段代码,对于波斯日期来说运行良好,非常棒的答案。 - Mehdi Dehghani
如果您不使用 PersianCalendar 类,则在同一日期上,当月份的天数不同时,可能会出现 ArgumentOutofRange 错误。 - ickydime

2
您可以使用以下内容:
static public string PersianDateString(DateTime d)
{
    var pc = new PersianCalendar();
    return string.Format("{0:0000}/{1:00}/{2:00}",
        pc.GetYear(d), pc.GetMonth(d), pc.GetDayOfMonth(d));
}

1
这只是将日期转换为波斯语。您必须获得有用的要点。问题是关于将日期格式化为波斯日期,如下所示:چهارشنبه . پنجم آذر ماه 1392,而您的答案则是有用性。 - QMaster

1
我创建了这个静态类。 结果将以以下格式显示:سه شنبه 28 اسفند 1398
public static class PersianDateString
{
    private static string[] Days = { "یک شنبه", "دو شنبه", "سه شنبه", "چهار شنبه", "پنج شنبه", "جمعه", "شنبه" };
    private static string[] Months = { "فروردین", "اریبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن" , "اسفند" };
    private static PersianCalendar pc = new PersianCalendar();

    public static string ToPersianDateString(this DateTime date)
    {
        return ($"{Days[pc.GetDayOfWeek(date).GetHashCode()]} {pc.GetDayOfMonth(date)} {Months[pc.GetMonth(date) - 1]} {pc.GetYear(date)}");
    }

}

使用
string ptime = DateTime.Now.ToPersianDateString();

1
这似乎也有效:

DateTime d= DateTime.Now;
Console.WriteLine( d.ToString("yyyy/MM/dd", new CultureInfo("fa-IR")) );

输出:
1399/06/26

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接