Re[3]: Excel 29.02.1900 и .NET/C#
От: Xander Zerge Россия www.zerge.com
Дата: 01.07.22 16:19
Оценка: 4 (1) +1
Здравствуйте, 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 найдёт юлианские год, день и месяц и выведет в строку. Как уже было написано, такого алгоритма во фреймворке нет, потому что нет культуры, к которой его можно было бы привязать, а в форматирование даты можно передавать культуру, но не сам календарь. Можешь сделать такой метод-расширение.
Серёжа Новиков,
программист
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.