Java或Joda中的Decimal DateTime格式化程序

时间:2008-11-16 07:11:02

标签: java datetime formatting jodatime

我正在写一个要求日期为十进制格式的文件:

  

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将于1900年1月2日下午4点

4 个答案:

答案 0 :(得分:1)

您可以创建一个输出当天小数部分的格式化程序。您需要使用DateTimeFormatterBuilder手动构建模式。使用appendFractionOfDay()添加分数。

答案 1 :(得分:0)

答案 2 :(得分:0)

不幸的是,你的问题不是很明确,但我有一种预感,即十进制时间你的意思是Julian date。 Java中有一篇关于converting date to julian date的帖子。

答案 3 :(得分:0)

您可以使用日历类执行此操作:

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

需要注意的事项:此代码仅在1900年2月28日之后有效.Excel incorrectly计算1900为闰年,当然为not。为了规避错误,计算会额外插入一天(2 * MILLIS_IN_DAY),但这当然会在假想的闰年发生之前破坏任何日期计算。