2

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

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

4 回答 4

1

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

于 2012-05-04T16:56:00.067 回答
0

getTime()方法有什么问题?

于 2008-11-16T07:26:10.687 回答
0

不幸的是,您的问题不是很清楚,但我有一种预感,十进制时间您的意思是Julian date。有一篇关于在 Java中将日期转换为朱利安日期的帖子。

于 2009-04-09T23:38:08.030 回答
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错误地将 1900 视为闰年,当然不是。为了规避这个错误,计算会插入一个额外的日期(2 * MILLIS_IN_DAY),但这当然会破坏假想闰年发生之前的任何日期计算。

于 2009-09-10T11:32:49.773 回答