2013-07-31 1 views
5

У меня возникли проблемы, представляющие персидскую (Solar хиджры календарь) даты как DateTime в C#, в частности, в определенные дни отдельные месяцы, например, 31/04, где в григорианском календаре такая дата не имеет смысла:Можно ли представить не gregorian даты как DateTime в .NET?

System.Globalization.PersianCalendar p = new System.Globalization.PersianCalendar(); 
DateTime date = new DateTime(2013,7,22); 
int year = p.GetYear(date); 
int month = p.GetMonth(date); 
int day = p.GetDayOfMonth(date); 
DateTime d1 = new DateTime(year, month, day); 

Приведенный выше код приведет к ArgumentOutOfRangeException говоря: Year, Month, and Day parameters describe an un-representable DateTime.

который, как ожидается.

Как я могу представить персидские даты как DateTime s в .NET с учетом дат счетов, таких как 30/02 и 31/04?

+0

Я просто догадываюсь, но эти даты по-прежнему соответствуют датам в gregorian календаре. Вероятно, вам придется представлять их в gregorian календаре в DateTime и делать конверсию в и из любой точки. Я не знаю, поддерживается ли это в Noda-Time, но вы проверили его? –

+0

Вы имеете в виду, что мне придется жить с представлением всех дат как григорианских дат, а затем для написания некоторого метода расширения для преобразования их в строки (это то, что я делаю сейчас)? Также что такое Noda-Time? –

ответ

3

Приведенный выше код приведет к выражению ArgumentOutOfRangeException, в котором говорится, что параметры Year, Month и Day описывают не представимые DateTime.

Да, поскольку, если вы не указали календарь, аргументы DateTime должны быть григорианскими. Вы можете указать календарь, хотя:

DateTime d1 = new DateTime(year, month, day, p); 

Обратите внимание, что если вы сейчас принять d1.Year, вы получите обратно 2013, не year ... DateTime является всегда григорианский, в основном. Тем не менее, если вы используете культуру с персидским календарем в качестве календаря по умолчанию, это будет соответствующим образом преобразовывать значения при форматировании DateTime в строку. EDIT: К сожалению, в соответствии с documentation:

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

В комментарии упомянули Noda Time, я могу обратиться к этому: он еще не поддерживает персидский календарь. Он поддерживает лунный календарь хиджры, но не солнечный один :(я мог смотреть на добавив, что в будущих версиях ...

+0

@MohammadSepahvand: Это именно то, что я сказал: вот как вы создаете значение DateTime из значений year/month/day в другом календаре, но 'DateTime' сам по сути является григорианским. –

+0

так в принципе, его невозможно? –

+1

Это * невозможно * получить DateTime, чтобы быть чем угодно, но gregorian, но вы можете получить помощь от фреймворка, чтобы сделать преобразование в и из. –

1

От MSDN;

Каждый член DateTime неявно использует григорианский календарь для выполнения своей работы, за исключением конструкторов, которые устанавливают календарь, а также методы с параметром, полученным из IFormatProvider, , такие как System.Globalization.DateTimeFormatInfo, который неявно указует календарь.

Кроме того, из PersianCalendar Class

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

Что вы хотите, кажется, не представляется возможным.