2008-11-16 68 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()添加分數。