OLEDate java实现

发布于 2024-08-28 19:41:58 字数 235 浏览 10 评论 0原文

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

I need a good OLEDate java implementation, and this one does not seem to be working. Is there any known good opensource implementations (like in apache commons)? If not, where do I read about it, so that I write my own implementation?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

爱格式化 2024-09-04 19:41:58

试试这个代码:

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

Try this code:

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;
}
二手情话 2024-09-04 19:41:58

之前的实现存在缺陷,例如 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());
    }
}

The previous implementation is buggy, e.g. wrong dates for 1.0 and -1.25.
The implementation below conforms to OLE date described in MSDN, e.g. here: https://msdn.microsoft.com/en-us/library/system.datetime.tooadate(v=vs.110).aspx

Implementation below does conform to the MSDN documentation.
It converts a BigDecimal value to Joda LocalDateTime.
BigDecimal is better than float and double since it is able to hold a precise value.

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());
    }
}
记忆で 2024-09-04 19:41:58

旧新事物博客条目似乎是关于该主题的不错的论文:

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

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

This Old New Thing blog entry seems to be a decent treatise on the topic:

The OLE automation date format is a floating point value, counting days since midnight 30 December 1899. Hours and minutes are represented as fractional days.

If you have access to Visual Studio and the MFC COleDateTime source, you can reimplement that in Java.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文