OLEDate java实现

我需要一个好的OLEDate java实现,而这个似乎不起作用。 是否有任何已知良好的开源实现(如apache commons)? 如果没有,我在哪里阅读它,以便我编写自己的实现?

这篇Old New Thing博客文章似乎是关于这个主题的一个不错的论文:

OLE自动化日期格式是浮点值,计算自1899年12月30日午夜以来的天数。小时和分钟表示为小数天。

如果您可以访问Visual Studio和MFC COleDateTime源,则可以在Java中重新实现它。

试试这段代码:

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; } 

之前的实现是错误的,例如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()); } } 
Interesting Posts