OLEDate Java-реализация - PullRequest
       46

OLEDate Java-реализация

3 голосов
/ 08 апреля 2010

Мне нужна хорошая Java-реализация OLEDate, и эта не работает. Есть ли известные хорошие реализации с открытым исходным кодом (как в Apache Commons)? Если нет, то где мне прочитать об этом, чтобы я написал свою собственную реализацию?

Ответы [ 3 ]

3 голосов
/ 21 июня 2013

Попробуйте этот код:

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 голосов
/ 12 февраля 2015

Предыдущая реализация содержит ошибки, например, неправильные даты для 1.0 и -1.25.Реализация ниже соответствует дате OLE, описанной в MSDN, например, здесь: 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());
    }
}
2 голосов
/ 12 апреля 2010

Эта запись в блоге Old New Thing , кажется, достойный трактат на тему:

Формат даты автоматизации OLE представляет собой значение с плавающей запятой, считая дни с полуночи 30 декабря 1899 года. Часы и минуты представлены в виде дробных дней.

Если у вас есть доступ к Visual Studio и источнику MFC COleDateTime, вы можете переопределить его в Java.

...