我正在写一个要求日期为十进制格式的文件:
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点
答案 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
),但这当然会在假想的闰年发生之前破坏任何日期计算。