Строка даты по юлианскому календарю для DateTime

Я пытаюсь преобразовать строку даты по юлианскому календарю в DateTime, но ни одно из решений в Интернете, похоже, не работает. У меня есть строка даты по юлианскому календарю 13324.

Julian Date: 13324

И я хочу получить следующий DateTime

Date: 20-Nov-2013

Не могли бы вы направить меня в правильном направлении. Спасибо.


person Oxon    schedule 29.11.2013    source источник
comment
Юлианская дата начинается в 4713 г. до н.э., а первое DateTime представимое - 0-0-0001. Мне любопытно посмотреть, как это будет решено.   -  person Jeroen Vannevel    schedule 29.11.2013


Ответы (3)


Это самое простое решение, которое я могу придумать:

string julianDate = "13324";

int jDate = Convert.ToInt32(julianDate);
int day = jDate % 1000;
int year = (jDate - day) / 1000;
var date1 = new DateTime(year, 1, 1);
var result = date1.AddDays(day - 1);

(Примечание: это все из памяти; проверьте синтаксис и т. Д.)

person Ann L.    schedule 29.11.2013
comment
Я получу правильный результат, если заменю 4-ю строку следующей. int year = (jDate - day + 2000000) / 1000; - person Oxon; 02.12.2013
comment
Вы получите другой результат, если конвертируете 13324 на этой странице aa.usno.navy .mil / data / docs / JulianDate.php и эта страница longpelaexpertise.com.au /toolsJulian.php Какой из них правильный? Я попытался преобразовать формулу на этой странице в C #, но это не дало мне правильного эквивалента DateTime: webcache.googleusercontent.com/ - person Oxon; 02.12.2013
comment
Как указывает Йерун Ванневель, истинная юлианская дата начинается в 4713 году до нашей эры. Это ценность, которую демонстрируют эти веб-сайты. То, что вас интересует, обычно называют датой по юлианскому календарю, но правильнее называть ее порядковой датой: en.wikipedia.org/wiki/Ordinal_date - person Ann L.; 02.12.2013

Извините за мой плохой английский

Попробуйте этот код, если тот, что наверху, не сработал. У меня это сработало.

public DateTime ConvertJulianToDatetime(string julianDate)
{
    int dateint = int.Parse(julianDate);

    DateTime dinicio = new DateTime(1840, 12, 31);
    dinicio = dinicio.AddDays((double)dateint);
    return dinicio;
}
person Hugo Araújo    schedule 17.09.2020

Я думаю, этот код более надежен (кто-нибудь может заметить):

public static DateTime FromJD(double JD)
{
    return DateTime.FromOADate(JD - 2415018.5);
}

Для MJD (модифицированный юлианский день). При необходимости можно добавить Math.Floor или Math.Ceiling:

public static DateTime FromMJD(double MJD)
{     
    return DateTime.FromOADate((MJD - 2415018.5) + 2400000.5);
}

И еще один пример обратного перевода:

public static double ToMJD(DateTime date)
{
    return (date.ToOADate() + 2415018.5) -2400000.5;
}

public static double ToJD(DateTime date)
{
    return date.ToOADate() + 2415018.5;
}
person Dream0fMe    schedule 19.05.2021