netlib.narod.ru | < Назад | Оглавление | Далее > |
Ниже перечислены три последних конструктора DateTime:
Конструкторы DateTime (выборочно)
DateTime(int year, int month, int day, Calendar cal) |
DateTime(int year, int month, int day, int hour, int minute, int sec, Calendar cal) |
DateTime(int year, int month, int day, int hour, int minute, int sec, int msec, Calendar cal) |
В качестве последнего аргумента передается объект типа Calendar. Он показывает, как интерпретировать аргументы года, месяца и дня. Я уже говорил, что конструкторы без аргумента Calendar интерпретируют даты в стиле Григорианского календаря.
Calendar — это абстрактный класс в пространстве имен System.Globalization, которое включает в себя и восемь производных классов класса Calendar.
Hijri (хиджра) — это одно из названий исламского календаря.
Если в качестве последнего аргумента конструктора DateTime указать объект типа Calendar, то становится возможным применение других правил соответствия дней, месяцев и годов. Например, инструкция:
DateTime dt = new DateTime(1900, 2, 29);
вызовет исключение, поскольку согласно Григорианскому календарю 1900 г. не являлся високосным. Однако инструкция:
DateTime dt = new DateTime(1900, 2, 29, new JulianCalendar());
исключения не сгенерирует, поскольку в Юлианском календаре високосным считается каждый год, кратный 4.
Более того, если вы создадите такой объект, передав ему аргумент JulianCaiendar, а затем просмотрите значения его свойств, то увидите, что значение свойства Month равно 3 (март), а свойства Day — 13. Свойства Year, Month и Day структуры DateTime всегда представляют дату в Григорианском стиле. Конструктор преобразует дату, указанную в его аргументах, в число 100-наносекундных порций, а свойства структуры DateTime переводят его в дату по Григорианскому календарю.
Принятие Григорианского календаря привело к тому, что сразу за днем 4 октября 1582 г следовало 15 октября 1582, т.е. было пропущено 10 дней 1. Если вы создадите такой объект:
dt = new DateTime(1582, 10, 5, new JulianCalendar());
то свойство Month будет содержать значение 10, но свойство Day — значение 15.
Становится интереснее. Предположим, вы сделали так:
dt = new DateTime(5762, 5, 20, new HebrewCalendar());
Да, это на самом деле год еврейского календаря — двадцатый день месяца шват 5762 г. Получившаяся в результате этого вызова структура DateTime содержит в свойстве Year значение 2002, а в свойствах Month и Day — 2, Таким образом, мы осуществили преобразование между еврейским и Григорианским календарем. Если последним аргументом, передаваемым конструктору DateTime, стоит объект HebrewCalendar, то для некоторых годов аргумент Month может принимать значение 13.
Подобным образом можно определить дату исламского календаря:
dt = new DateTime(1422, 11, 20, new HijriCalendar());
Аргументы конструктора выставлены на двадцатый день месяца зуль-каада 1422 г. И снова в результате структура DateTime содержит в свойстве Year значение 2002, а в свойствах Month и Day — 2.
Для преобразования даты из Григорианской в какую-либо другую систему летоисчисления следует создать экземпляр требуемого календаря, например:
HebrewCalendar hebrewcal = new HebrewCalendar(); HijriCalendar hijrical = new HijriCalendar();
Кроме того, вам понадобится объект DateTime:
DateTime dt = new DateTime(2002, 2, 2);
Наконец, чтобы преобразовать дату из Григорианской в еврейскую или исламскую систему, потребуются следующие три метода:
Методы Calendar (выборочно)
int GetYear(DateTime dt) |
int GetMonth(DateTime dt) |
int GetDayOfMonth(DateTime dt) |
Например, инструкция
hijrical.GetYear(dt)
возвращает значение 1422.
1За несколько лет до празднования нового тысячелетия было издано несколько книг, рассказывающих об истории Юлианского и Григорианского календарей. Возможно самая короткая и яркая из них — «Загадки тысячелетия: Рациональное руководство по точному отсчету» Стивена Джей Гоулда (Stephen Jay Gould, «Questioning the Millennium: A Rationalist's Guide to a Precisely Arbitrary Countdown», New York: Harmony Books, 1997).
netlib.narod.ru | < Назад | Оглавление | Далее > |