Десятичный форматировщик DateTime в Java или Joda - PullRequest
2 голосов
/ 16 ноября 2008

Я пишу файл, в котором даты должны быть в десятичном формате:

2007-04-24T13:18:09 становится 39196.554270833331000

У кого-нибудь есть средство форматирования времени, которое будет это делать (десятичное время - это то, что использует VB / Office и т. Д.)?

Основной код выглядит следующим образом:

final DateTime date = new DateTime(2007, 04, 24, 13, 18, 9, 0, DateTimeZone.UTC);
double decimalTime = (double) date.plusYears(70).plusDays(1).getMillis() / (Days.ONE.toStandardDuration().getMillis())); //=39196.554270833331000.

Для примера выше.

(я начал с DateTimePrinter, который бы делал это, но сейчас это слишком сложно (у меня нет связанного источника joda, поэтому я не могу легко получить идеи)).

Примечание. Десятичное время - это количество дней с 1900 года. представляет неполные дни. 2.6666666 будет 4 вечера 2 января 1900

Ответы [ 4 ]

1 голос
/ 04 мая 2012

Вы можете создать форматер, который выводит десятичную дробь дня. Вам нужно использовать DateTimeFormatterBuilder, чтобы создать шаблон вручную. Фракция добавляется с помощью appendFractionOfDay () .

0 голосов
/ 10 апреля 2009

К сожалению, ваш вопрос не очень ясен, но у меня есть догадка, что с десятичным временем вы имеете в виду юлианскую дату . В Java есть сообщение о конвертации даты в юлианскую дату .

0 голосов
/ 10 сентября 2009

Вы можете сделать это, используя класс календаря:

final long MILLIS_IN_DAY = 1000L * 60L * 60L * 24L;

final Calendar startOfTime = Calendar.getInstance();
startOfTime.setTimeZone(TimeZone.getTimeZone("UTC"));
startOfTime.clear();
startOfTime.set(1900, 0, 1, 0, 0, 0);

final Calendar myDate = Calendar.getInstance();
myDate.setTimeZone(TimeZone.getTimeZone("UTC"));
myDate.clear();
myDate.set(2007, 3, 24, 13, 18, 9); // 2007-04-24T13:18:09

final long diff = myDate.getTimeInMillis() - startOfTime.getTimeInMillis() + (2 * MILLIS_IN_DAY);
final double decimalTime = (double) diff / (double) MILLS_IN_DAY;
System.out.println(decimalTime); // 39196.55427083333

Что следует отметить: этот код будет работать только после 28 февраля 1900 года. Excel неправильно считает 1900 високосным годом, который, конечно, равен , а не . Чтобы обойти ошибку, в расчет добавляется дополнительный день (2 * MILLIS_IN_DAY), но это, конечно, искажает все вычисления даты до того, как произошел воображаемый високосный год.

0 голосов
/ 16 ноября 2008
...