2008-11-16 70 views
2

我写信,要求日期为十进制格式的文件:十进制格式的日期时间在Java或乔达

2007-04-24T13:18:09成为39196.554270833331000

没有人有时间格式,将做到这(十进制时间是什么VB/Office等使用)?

Basic代码是这样如下:

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

呃...我的印象是十进制时间是自1900年以来的天数,而不是1970年:http://support.microsoft.com/kb/214094 – Powerlord 2009-04-13 21:20:47

+0

良好的捕获 - 这就是为什么plusYears(70)是否有 - 将millis“转换”为1900年而不是1970年。(我刚刚读了我的代码错误) – Stephen 2009-04-15 22:29:37

回答

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 

一些需要注意:此代码仅将2月28日1900的Excel incorrectly计数后,1900年的工作为闰年,它当然是not。为了规避该错误,计算会插入额外的一天(2 * MILLIS_IN_DAY),但这当然会在虚拟闰年发生之前破坏任何日期计算。

1

您可以创建一个输出当日小数部分的格式器。您需要使用DateTimeFormatterBuilder手动建立模式。使用appendFractionOfDay()添加分数。