2010-04-08 70 views
3

我需要一個好的OLEDate Java實現,this one似乎並沒有工作。是否有任何已知的良好的開源實現(如在Apache共享)?如果沒有,我在哪裏讀到它,這樣我就可以編寫我自己的實現了?OLEDate java實現

+0

爲什麼koders.com代碼不起作用?最近我可以告訴,它取決於浮點實現,它根本不是便攜式的。 – 2010-04-12 16:43:54

回答

2

Old New Thing blog entry似乎是關於這一主題的體面論文:

OLE自動化日期格式是浮點值,因爲午夜12月30日1899小時和分鐘被表示爲小數天計數天。

如果您有權訪問Visual Studio和MFC COleDateTime源,則可以在Java中重新實現。

3

試試這個代碼:

public static Date getDateFromCOMDate(float comtime) { 
    String floatstr = String.valueOf(comtime); 
    String [] ss = floatstr.split("\\."); 
    long nulltime = -2209183200000L; 
    long dayms = 86400000; 
    int days = Integer.valueOf(ss[0]); 
    float prop = comtime - days; 
    long cdayms = Math.round(dayms * prop); 
    long time = nulltime + days*dayms + cdayms; 
    Date d = new Date(time); 
    return d; 
} 
2

以前的實現是越野車,例如錯誤的日期爲1.0和-1.25。下面的實現符合MSDN中描述的OLE日期,例如這裏:https://msdn.microsoft.com/en-us/library/system.datetime.tooadate(v=vs.110).aspx

下面的實現符合MSDN文檔。 它將BigDecimal值轉換爲Joda LocalDateTime。 BigDecimal比float和double更好,因爲它能夠保持精確的值。

class COMDateToRegularDateConverter { 
    private static final LocalDateTime ZERO_COM_TIME = new LocalDateTime(1899, 12, 30, 0, 0); 
    private static final BigDecimal MILLIS_PER_DAY = new BigDecimal(86400000); 

    LocalDateTime toLocalDateTime(BigDecimal comTime) { 
     BigDecimal daysAfterZero = comTime.setScale(0, RoundingMode.DOWN); 
     BigDecimal fraction = comTime.subtract(daysAfterZero).abs(); //fraction always represents the time of that day 
     BigDecimal fractionMillisAfterZero = fraction.multiply(MILLIS_PER_DAY).setScale(0, RoundingMode.HALF_DOWN); 

     return ZERO_COM_TIME.plusDays(daysAfterZero.intValue()).plusMillis(fractionMillisAfterZero.intValue()); 
    } 
}