Introduction
The Calendar
property of DateTimeFormatInfo
accepts only calendars that are valid for the culture associated with this instance of DateTimeFormatInfo
. For example, if the current instance originated from the DateTimeFormatInfo
property of a "fa-Ir
" CultureInfo
object, this property can accept only the calendars that are valid for the "fa-Ir
" culture. The CultureInfo.Calendar
property specifies the default calendar (GregorianCalendar
) for the culture and the CultureInfo.OptionalCalendars
property specifies all calendars supported by the culture (GregorianCalendar
and HijriCalendar
).
.NET Framework doesn't support Persian calendar for the culture. This culture doesn't accept the calendar; therefore display of DateTime
in this culture is impossible.
A well known solution to solve this problem is declaring a new type like PersianDate
. This type wraps DateTime
. Developers should use it without functionalities of DateTime
and other classes that depend on it. Therefore I present a solution to solve these problems.
Background
For setting the calendar to culture, its OptionalCalendars
should have a specified calendar. In Persian Culture, this calendar doesn't exist. This code raises an exception:
info.DateTimeFormat.Calendar = new PersianCalendar();
Using the Code
Use PersianCultureHelper
to set Persian calendars as:
CultureInfo info = new CultureInfo("fa-Ir");
PersianCultureHelper.SetPersianOptions(info);
This class sets an instance of PersianCalendar
to a specified culture by using reflection. It finds private
fields of the culture and its DateTimeFormatInfo
and sets correct values for them. With this solution, you don't need a new version of DateTime
.
Using this solution, you achieve two advantages:
- You can work with
DateTime
and display it without getting an exception:
- You can enable .NET Framework features for the culture the same as ASP.NET calendar functionality like:
You can install “Persian Culture Package.msi” and write this code:
CultureInfo info = new CultureInfo("fa-Ir");
info.DateTimeFormat.Calendar = new PersianCalendar();
This setup enables .NET Framework’s custom culture only with copying fa-IR.nlp file to %SystemRoot%\Globalization. You can get more information about creating custom culture from MSDN.
History
- 28th December, 2008: Initial post