From 63ef215f57322dd5d7a27799a2a3fe463bd39fc7 Mon Sep 17 00:00:00 2001 From: "Jennifer (Jenny) Bryan" Date: Sat, 11 Mar 2017 20:49:20 -0800 Subject: [PATCH] Date subsecond rounding; fixes #187 (#290) * Date subsecond rounding; fixes #187 * Add a source for the rounding sol'n; re-save test sheets just to be safe --- src/XlsCell.h | 3 ++- src/XlsxCell.h | 2 +- src/utils.h | 11 +++++++++++ tests/testthat/sheets/datetime-rounding.xls | Bin 0 -> 54784 bytes tests/testthat/sheets/datetime-rounding.xlsx | Bin 0 -> 27802 bytes tests/testthat/test-dates.R | 11 +++++++++++ 6 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 tests/testthat/sheets/datetime-rounding.xls create mode 100644 tests/testthat/sheets/datetime-rounding.xlsx diff --git a/src/XlsCell.h b/src/XlsCell.h index 6a2e9c4c..b2e0eb7a 100644 --- a/src/XlsCell.h +++ b/src/XlsCell.h @@ -5,6 +5,7 @@ #include #include #include "ColSpec.h" +#include "utils.h" // Key reference for understanding the structure of the xls format is // [MS-XLS]: Excel Binary File Format (.xls) Structure @@ -287,7 +288,7 @@ class XlsCell { case CELL_DATE: case CELL_NUMERIC: - return (cell_->d - offset) * 86400; + return dateRound((cell_->d - offset) * 86400); } } diff --git a/src/XlsxCell.h b/src/XlsxCell.h index 7e3956e4..93c4f352 100644 --- a/src/XlsxCell.h +++ b/src/XlsxCell.h @@ -268,7 +268,7 @@ class XlsxCell { case CELL_NUMERIC: { rapidxml::xml_node<>* v = cell_->first_node("v"); - return (atof(v->value()) - offset) * 86400; + return dateRound((atof(v->value()) - offset) * 86400); } } } diff --git a/src/utils.h b/src/utils.h index 2617a6fa..1a737005 100644 --- a/src/utils.h +++ b/src/utils.h @@ -18,6 +18,17 @@ inline double dateOffset(bool is1904) { return is1904 ? 24107 : 25569; } +// this is sort of horrible +// convert serial date to decimilliseconds +// use well-known hack to round to nearest integer w/o C++11 or boost, e.g. +// http://stackoverflow.com/questions/485525/round-for-float-in-c +// convert back to serial date +inline double dateRound(double dttm) { + double ms = dttm * 10000; + ms = (ms >= 0.0 ? std::floor(ms + 0.5) : std::ceil(ms - 0.5)); + return ms / 10000; +} + // Simple parser: does not check that order of numbers and letters is correct inline std::pair parseRef(const char* ref) { int col = 0, row = 0; diff --git a/tests/testthat/sheets/datetime-rounding.xls b/tests/testthat/sheets/datetime-rounding.xls new file mode 100644 index 0000000000000000000000000000000000000000..03d20ed7592e90725e41236de29def5c69990e06 GIT binary patch literal 54784 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�X+|0P)N^Bg1Woowkn7tA5Q6Z@>3- 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 literal 0 HcmV?d00001 diff --git a/tests/testthat/test-dates.R b/tests/testthat/test-dates.R index a21e03bb..2e260602 100644 --- a/tests/testthat/test-dates.R +++ b/tests/testthat/test-dates.R @@ -10,3 +10,14 @@ test_that("dates respect worksheet date setting", { expect_equal(d1900, d1900loo) expect_equal(d1900$X1, ISOdate(2000, 01, 01, 0, tz = "UTC")) }) + +## #187 Date/times missing a second +test_that("date subsecond rounding works", { + ## xlsx + df <- read_excel(test_sheet("datetime-rounding.xlsx")) + expect_identical(as.character(df$dttm), df$dttm_string) + + ## xls + df <- read_excel(test_sheet("datetime-rounding.xls")) + expect_identical(as.character(df$dttm), df$dttm_string) +})