Преобразование даты по юлианскому календарю

Sample Julian Dates:
2009218
2009225
2009243

Как преобразовать их в обычную дату?

Я попытался преобразовать их с помощью онлайн-конвертера и получил:

12-13-7359 за 2009225!! Без разницы!


person Milli Szabo    schedule 14.06.2010    source источник
comment
ваши примеры не юлианские даты. юлианская дата - это количество дней с 1 января 4713 г. до н.э., например 2.451.545 для 01.01.2000. (если 2009225 — это юлианская дата, как вы хотите, онлайн-конвертер подходит)   -  person oezi    schedule 14.06.2010
comment
Я так и думал, но понятия не имею, что это за даты! Не могу даже спросить.   -  person Milli Szabo    schedule 14.06.2010
comment
мне непонятно, из чего вы пытаетесь преобразовать: даты по юлианскому календарю? Или модифицированные юлианские дни (астрономические данные), как в вашей ссылке? Если эти даты начинаются с года, возникает двусмысленность (2009111 — это 11 января или 1 ноября?).   -  person McDowell    schedule 14.06.2010
comment
Я хотел бы спросить клиента и ответить на ваш вопрос.   -  person Milli Szabo    schedule 14.06.2010
comment
Единственное, что я могу придумать, это то, что они имеют формат YYYYDDD - DDD-й день года YYYY. Однако, если вы хотите убедиться, что все сделано правильно, вы должны спросить источник дат или, по крайней мере, иметь достаточное количество примеров (как закодированную дату, так и соответствующую фактическую дату ), чтобы иметь возможность определить смысл.   -  person Michael Madsen    schedule 14.06.2010


Ответы (2)


Используйте библиотеку Joda-Time и сделайте что-то вроде этого:

String dateStr = "2009218";
MutableDateTime mdt = new MutableDateTime();
mdt.setYear(Integer.parseInt(dateStr.subString(0,3)));
mdt.setDayOfYear(Integer.parseInt(dateStr.subString(4)));
Date parsedDate  = mdt.toDate();

Использование Java-API:

String dateStr = "2009218";
Calendar cal  = new GregorianCalendar();
cal.set(Calendar.YEAR,Integer.parseInt(dateStr.subString(0,3)));
cal.set(Calendar.DAY_OF_YEAR,Integer.parseInt(dateStr.subString(4)));
Date parsedDate  = cal.getTime();

---- РЕДАКТИРОВАТЬ ---- Спасибо Алексу за лучший ответ:

Date myDate = new SimpleDateFormat("yyyyD").parse("2009218")
person Mike Sickler    schedule 14.06.2010
comment
MutableDateTime вычислит месяц, так как он знает год и день года. - person Mike Sickler; 14.06.2010
comment
Разве я не могу использовать Java API для этого? - person Milli Szabo; 14.06.2010
comment
Буду признателен за голосование и/или пометку моего ответа как правильного :) - person Mike Sickler; 14.06.2010
comment
Извини, моя ошибка. :)) Примечание. Возможно, вы захотите отредактировать немного дальше, так как set не имеет методов (int, long). Возможно, вы захотите изменить их на целые. - person Milli Szabo; 14.06.2010
comment
Используйте встроенные парсеры даты! - person Alex Feinman; 14.06.2010
comment
Разработка по этому поводу была бы очень признательна. Спасибо. - person Milli Szabo; 14.06.2010
comment
Алекс прав. Это лучший ответ, вы можете сделать new SimpleDateFormat("yyyyD").parse("2009218"), чтобы получить свой объект Date - person Mike Sickler; 14.06.2010

Другой формат — CYYDDDD. Я написал эту функцию на Java.

public static int convertToJulian(Date date){
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    int year = calendar.get(Calendar.YEAR);
    String syear = String.format("%04d",year).substring(2);
    int century = Integer.parseInt(String.valueOf(((year / 100)+1)).substring(1));
    int julian = Integer.parseInt(String.format("%d%s%03d",century,syear,calendar.get(Calendar.DAY_OF_YEAR)));
    return julian;
}
person gishac    schedule 26.02.2012