From be77e4a00a67f5205d802171aba2566337b4f852 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Mon, 15 May 2023 20:02:37 +0600 Subject: [PATCH] add processing dates before 1900 --- .../CellFormatController.cpp | 5 ++-- .../CellFormatController/DateReader.cpp | 28 +++++++++++++------ .../Reader/CellFormatController/DateReader.h | 13 ++++++++- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/OOXML/Binary/Sheets/Reader/CellFormatController/CellFormatController.cpp b/OOXML/Binary/Sheets/Reader/CellFormatController/CellFormatController.cpp index c231fa3d4b..7ded317d7c 100644 --- a/OOXML/Binary/Sheets/Reader/CellFormatController/CellFormatController.cpp +++ b/OOXML/Binary/Sheets/Reader/CellFormatController/CellFormatController.cpp @@ -131,8 +131,9 @@ void CellFormatController::ProcessCellType(OOX::Spreadsheet::CCell *pCell, const } DateReader dateReader = {}; - auto digitalDate = dateReader.GetDigitalDate(value); - if(digitalDate != 0) + _INT32 digitalDate = 0; + auto validDate = dateReader.GetDigitalDate(value, digitalDate); + if(validDate) { pCell->m_oValue.Init(); pCell->m_oValue->m_sText = std::to_wstring(digitalDate); diff --git a/OOXML/Binary/Sheets/Reader/CellFormatController/DateReader.cpp b/OOXML/Binary/Sheets/Reader/CellFormatController/DateReader.cpp index 52b5beff41..b1541aeee9 100644 --- a/OOXML/Binary/Sheets/Reader/CellFormatController/DateReader.cpp +++ b/OOXML/Binary/Sheets/Reader/CellFormatController/DateReader.cpp @@ -50,7 +50,7 @@ std::vector DateFormats = { L"%m-%d-%y", L"%d-%m-%Y", L"%d-%m-%y" }; -_UINT32 DateReader::GetDigitalDate(const std::wstring &date) +bool DateReader::GetDigitalDate(const std::wstring &date, _INT32 &result) { // Перебор форматов даты, пока не найдется подходящий for (const auto& format : DateFormats) { @@ -64,13 +64,25 @@ _UINT32 DateReader::GetDigitalDate(const std::wstring &date) continue; } - // Преобразование даты в формат excel - auto tp = std::chrono::system_clock::from_time_t(mktime(&time)); - auto excelTime = (tp.time_since_epoch().count() / 10000000) + 2209161600; - double tempTime = excelTime / 86400.0; - return round(excelTime / 86400.0); + //определяем стандартная ли дата + + if(time.tm_year > 0) + { + result = getStandartDate(time); + return true; + } + return false; } - // Если не найден подходящий формат даты, возвращаем 0 - return 0; + // Если не найден подходящий формат даты, возвращаем false + return false; } + +_INT32 DateReader::getStandartDate(tm &date) +{ + // Преобразование даты в формат excel + auto tp = std::chrono::system_clock::from_time_t(mktime(&date)); + auto excelTime = (tp.time_since_epoch().count() / 10000000) + 2209161600; + _INT32 tempTime = round(excelTime / 86400.0); + return tempTime; +} \ No newline at end of file diff --git a/OOXML/Binary/Sheets/Reader/CellFormatController/DateReader.h b/OOXML/Binary/Sheets/Reader/CellFormatController/DateReader.h index 1b551245a3..7a79f827e9 100644 --- a/OOXML/Binary/Sheets/Reader/CellFormatController/DateReader.h +++ b/OOXML/Binary/Sheets/Reader/CellFormatController/DateReader.h @@ -35,10 +35,21 @@ #include "../../../../Base/Base.h" #include +#include class DateReader { public: - _UINT32 GetDigitalDate(const std::wstring &date); + /// @brief получение даты в виде числа в формате excel + /// @param date дата в строковом формате + /// @param result результат в формате excel + /// @param return true в случае успешной конвертации, иначе false + bool GetDigitalDate(const std::wstring &date, _INT32 &result); + +private: + /// @brief получение даты в виде числа в формате excel из дат позднее 1900 года + /// @param datetime структура с датой + /// @return дата в формате excel + _INT32 getStandartDate(tm &date); };