Есть ли тип BigDateTime для .net? - PullRequest
       27

Есть ли тип BigDateTime для .net?

2 голосов
/ 09 августа 2009

Мне нужно представить даты раньше, чем 1 января 0001 года. Знаете ли вы библиотеку, которая включает такой тип?

Он должен обеспечивать следующие функциональные возможности:

  • Добавить / Вычесть
  • BigTimeSpan
  • Больше / Меньше, чем сравнение

Было бы хорошо, если бы значения были менее точными, чем дольше дата назад.

Ответы [ 4 ]

4 голосов
/ 13 августа 2009

В 45 г. до н.э. было 445 дней, поэтому вам нужно добавить это и перейти от Юлиана (45bc) к предыдущему римскому календарю. Смена григорианского календаря произошла намного позже (на 1500 с), чем вам нужно, поэтому вам не нужно об этом беспокоиться.

Две основные проблемы использования DateTime - это минимальная и максимальная константы. Очевидно, что являясь структурой, вы не можете подклассировать ее.

Моим первым вариантом будет написать мою структуру BigDateTime или BCDateTime и использовать внутри нее DateTime через композицию. Затем вы можете установить свой текущий календарь:

CultureInfo.CurrentCulture.DateTimeFormat.Calendar = new JulianCalendar();

для Джулиана , но, как я уже говорил, это дает вам 45 лет до нашей эры

Если год меньше 45, вы снова переключаете Календари на свой собственный подкласс Календарь объект. Если год 45, вам понадобится еще один Календарь с 445 днями для этого года (они сделали это для настройки более старого Календаря).

Какими будут ваши минимальные и максимальные константы для этого объекта? Рассвет самой цивилизации ?!

Вам нужно будет выбрать их, а также помнить, что юлианский календарь и его предыдущая нереформированная версия были специфичны для стран Римской империи. Будучи жителем Запада, я не имею представления о других существующих календарях, вы получите гораздо больше информации из википедии статей хотя .

Если вы решите использовать все культуры, тогда у вас есть гигантская задача (как это делала оригинальная команда .NET) для реализации уже существующих календарей. Различные календари имеют разные начальные эпохи относительно BC, такие как исламские, китайские и индуистские календари. Больше информации об этом здесь . Поэтому, если вы хотите, чтобы каждая культура, а не только Римская империя, вам нужно будет сделать свою собственную версию следующего или хотя бы некоторые из них:

System.Globalization.Calendar
    System.Globalization.EastAsianLunisolarCalendar 
    System.Globalization.GregorianCalendar 
    System.Globalization.HebrewCalendar 
    System.Globalization.HijriCalendar 
    System.Globalization.JapaneseCalendar 
    System.Globalization.JulianCalendar 
    System.Globalization.KoreanCalendar 
    System.Globalization.PersianCalendar 
    System.Globalization.TaiwanCalendar 
    System.Globalization.ThaiBuddhistCalendar 
    System.Globalization.UmAlQuraCalendar

Удачи! Было бы интересно посмотреть, как вы поживаете.

2 голосов
/ 13 августа 2009
2 голосов
/ 09 августа 2009

Взгляните на эту ветку на SO с точно таким же вопросом. По сути, встроенной поддержки нет, поэтому вам нужно найти стороннюю реализацию или собрать ее самостоятельно.

1 голос
/ 13 августа 2009

Если вам действительно нужны только эти три операции (т.е. без дня недели, дня месяца, часовых поясов и т. Д.): Просто используйте long как количество секунд (или миллисекунд) от даты разворота. 2 ^ 64 секунды дают вам полтриллиона лет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...