DateTime и юлианский календарь. Что не так с DateTime.ToString()?

У меня есть приложение, в котором я использую григорианский календарь с DateTime. В последнее время я решил сделать так, чтобы приложение использовало и юлианский календарь, если пользователь этого требует (все еще есть люди, использующие этот календарь). Поначалу все казалось довольно легко. Я мог бы указать используемый календарь в конструкторе DateTime:

var calend = new JulianCalendar();
DateTime dt = new DateTime(year, j, i, calend);

Я мог бы получить количество дней в каждом месяце и день недели (это, кажется, отличается от григорианского календаря!):

int days = calend.GetDaysInMonth(year, month);
DayOfWeek dayOfWeek = dt.DayOfWeek;

Что меня поразило и обеспокоило, так это вывод DateTime.ToString(). Вроде печатает дату по григорианскому календарю:

http://msdn.microsoft.com/en-us/library/system.globalization.juliancalendar%28v=vs.71%29.aspx

В настоящее время JulianCalendar не используется ни в одной из культур, поддерживаемых классом CultureInfo; поэтому этот класс можно использовать только для вычисления дат по юлианскому календарю.

http://msdn.microsoft.com/en-us/library/9bksd5y7.aspx

Поскольку персидский календарь не может быть назначен календарем по умолчанию для языка и региональных параметров, для отображения даты в персидском календаре требуются отдельные вызовы его методов PersonCalendar.GetMonth, PersonCalendar.GetDayOfMonth и PersianCalendar.GetYear.

Итак, как проще всего напечатать дату в юлианском календаре?


person NoOne    schedule 27.05.2013    source источник


Ответы (1)


Использование метода расширения:

static class JulianPrinter
{
    public static string ToString(this DateTime date, string format, CultureInfo ci, Calendar cal)
    {
        if (format == "D")
            return string.Format("{0}, {1} {2} {3}",
                ci.DateTimeFormat.GetDayName(cal.GetDayOfWeek(date)),
                cal.GetDayOfMonth(date),
                ci.DateTimeFormat.MonthGenitiveNames[cal.GetMonth(date) - 1], //ci.DateTimeFormat.GetMonthName(cal.GetMonth(date)),
                cal.GetYear(date));
        return "";
    }
}

...а также :

var calend = new JulianCalendar();
DateTime dt = new DateTime(year, j, i, calend);
string printed = dt.ToString("D", ci, calend);
person NoOne    schedule 27.05.2013