我正在写一个要求日期为十进制格式的文件。
2007-04-24T13:18:09
变成39196.554270833331000
有谁有时间格式器可以做到这一点(十进制时间是VBOffice等使用的)?
基本代码如下。
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点。
你可以创建一个格式器,输出一天的小数分数。你需要使用 DateTimeFormatterBuilder
来手动建立模式。分数是用 appendFractionOfDay().
你可以使用日历类来实现。
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 错 闰土年 不. 为了规避这个错误,计算中插入了额外的一天(2 * MILLIS_IN_DAY
),但这当然会破坏虚构闰年发生之前的任何日期计算。
有什么问题吗?getTime() 办法?