Здравствуйте, fortnum, Вы писали:
F>Вот есть еще как минимум один календарь. В юлианском 29.02.1900 — это законный день, потому что по нему 1900й год — високосный. И 1 тик в юлианском равен 1 тику в григорианском. То есть по юлианскому календарю после последнего тика 28.02.1900 наступает как раз 29.02.1900. Тики одни и те же, просто обозначение дней разное. Нет технических сложностей перевести день из юлианского в григорианский и обратно (хотя тут я не буду утверждать, может там и есть какая-то хитрость, надо разобраться). Вот (вроде в браузере должно работать) получаем, что 29.02.1900 по юлианскому = 13.03.2900 по григорианскому:
F>F>using System;
F>using System.Globalization;
F>var dateTime = new DateTime(1900, 2, 29, 23, 59, 59, new JulianCalendar());
Вот здесь dateTime уже григорианская, про JulianCalendar() уже можно забыть. Он используется только в конструкторе, чтобы привести переданные год, месяц и день к григорианскому.
F>Console.WriteLine(dateTime);
F>
F>Но неужели никто не сделал форматирование этих юлианских дат в строку? Пока только Noda Time глянул мельком, но как я понял, она тоже это не умеет, вывести 29.02.1900 по юлианскому в строку.
Нет, потому что юлианской даты физически нет. Только григорианская. Такова спецификация DateTime.
F>Для юлианских дат нужны отдельные какие-то алгоритмы форматирования строк, чтобы выводить даты по тем же строкам форматирования, что и григорианские? Или там какой-то общий всё же алгоритм? Мн кажется, что должен быть общий, но пока еще не вникал.
Да, нужен алгоритм, который из григорианской DateTime найдёт юлианские год, день и месяц и выведет в строку. Как уже было написано, такого алгоритма во фреймворке нет, потому что нет культуры, к которой его можно было бы привязать, а в форматирование даты можно передавать культуру, но не сам календарь. Можешь сделать такой метод-расширение.