14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2016 PDFium Authors. All rights reserved. 24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file. 44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/cpdfsdk_datetime.h" 84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_ext.h" 104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannnamespace { 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint GetTimeZoneInSeconds(int8_t tzhour, uint8_t tzminute) { 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return (int)tzhour * 3600 + (int)tzminute * (tzhour >= 0 ? 60 : -60); 154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool IsLeapYear(int16_t year) { 184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))); 194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint16_t GetYearDays(int16_t year) { 224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return (IsLeapYear(year) ? 366 : 365); 234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint8_t GetMonthDays(int16_t year, uint8_t month) { 264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t mDays; 274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann switch (month) { 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case 1: 294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case 3: 304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case 5: 314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case 7: 324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case 8: 334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case 10: 344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case 12: 354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mDays = 31; 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case 4: 394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case 6: 404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case 9: 414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case 11: 424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mDays = 30; 434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case 2: 464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (IsLeapYear(year)) 474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mDays = 29; 484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mDays = 28; 504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann default: 534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mDays = 0; 544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return mDays; 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} // namespace 614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDFSDK_DateTime::CPDFSDK_DateTime() { 634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ResetDateTime(); 644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDFSDK_DateTime::CPDFSDK_DateTime(const CFX_ByteString& dtStr) { 674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ResetDateTime(); 684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FromPDFDateTimeString(dtStr); 694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDFSDK_DateTime::CPDFSDK_DateTime(const CPDFSDK_DateTime& that) 724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : m_year(that.m_year), 734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_month(that.m_month), 744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_day(that.m_day), 754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_hour(that.m_hour), 764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_minute(that.m_minute), 774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_second(that.m_second), 784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_tzHour(that.m_tzHour), 794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_tzMinute(that.m_tzMinute) {} 804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDFSDK_DateTime::CPDFSDK_DateTime(const FX_SYSTEMTIME& st) { 824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tzset(); 834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_year = static_cast<int16_t>(st.wYear); 854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_month = static_cast<uint8_t>(st.wMonth); 864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_day = static_cast<uint8_t>(st.wDay); 874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_hour = static_cast<uint8_t>(st.wHour); 884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_minute = static_cast<uint8_t>(st.wMinute); 894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_second = static_cast<uint8_t>(st.wSecond); 904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDFSDK_DateTime::ResetDateTime() { 934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann tzset(); 944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann time_t curTime; 964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann time(&curTime); 974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann struct tm* newtime = localtime(&curTime); 994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_year = newtime->tm_year + 1900; 1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_month = newtime->tm_mon + 1; 1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_day = newtime->tm_mday; 1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_hour = newtime->tm_hour; 1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_minute = newtime->tm_min; 1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_second = newtime->tm_sec; 1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDFSDK_DateTime::operator==(const CPDFSDK_DateTime& that) const { 1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_year == that.m_year && m_month == that.m_month && 1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_day == that.m_day && m_hour == that.m_hour && 1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_minute == that.m_minute && m_second == that.m_second && 1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_tzHour == that.m_tzHour && m_tzMinute == that.m_tzMinute; 1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDFSDK_DateTime::operator!=(const CPDFSDK_DateTime& datetime) const { 1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return !(*this == datetime); 1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanntime_t CPDFSDK_DateTime::ToTime_t() const { 1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann struct tm newtime; 1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann newtime.tm_year = m_year - 1900; 1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann newtime.tm_mon = m_month - 1; 1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann newtime.tm_mday = m_day; 1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann newtime.tm_hour = m_hour; 1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann newtime.tm_min = m_minute; 1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann newtime.tm_sec = m_second; 1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return mktime(&newtime); 1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDFSDK_DateTime& CPDFSDK_DateTime::FromPDFDateTimeString( 1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_ByteString& dtStr) { 1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int strLength = dtStr.GetLength(); 1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (strLength <= 0) 1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return *this; 1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int i = 0; 1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < strLength && !std::isdigit(dtStr[i])) 1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i >= strLength) 1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return *this; 1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int j = 0; 1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int k = 0; 1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_CHAR ch; 1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < strLength && j < 4) { 1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = dtStr[i]; 1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann k = k * 10 + FXSYS_toDecimalDigit(ch); 1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann j++; 1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!std::isdigit(ch)) 1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann i++; 1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_year = static_cast<int16_t>(k); 1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i >= strLength || j < 4) 1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return *this; 1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann j = 0; 1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann k = 0; 1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < strLength && j < 2) { 1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = dtStr[i]; 1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann k = k * 10 + FXSYS_toDecimalDigit(ch); 1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann j++; 1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!std::isdigit(ch)) 1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann i++; 1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_month = static_cast<uint8_t>(k); 1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i >= strLength || j < 2) 1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return *this; 1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann j = 0; 1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann k = 0; 1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < strLength && j < 2) { 1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = dtStr[i]; 1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann k = k * 10 + FXSYS_toDecimalDigit(ch); 1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann j++; 1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!std::isdigit(ch)) 1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann i++; 1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_day = static_cast<uint8_t>(k); 1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i >= strLength || j < 2) 1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return *this; 1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann j = 0; 1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann k = 0; 1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < strLength && j < 2) { 1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = dtStr[i]; 1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann k = k * 10 + FXSYS_toDecimalDigit(ch); 1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann j++; 1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!std::isdigit(ch)) 1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann i++; 1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_hour = static_cast<uint8_t>(k); 1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i >= strLength || j < 2) 1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return *this; 2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann j = 0; 2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann k = 0; 2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < strLength && j < 2) { 2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = dtStr[i]; 2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann k = k * 10 + FXSYS_toDecimalDigit(ch); 2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann j++; 2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!std::isdigit(ch)) 2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann i++; 2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_minute = static_cast<uint8_t>(k); 2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i >= strLength || j < 2) 2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return *this; 2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann j = 0; 2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann k = 0; 2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < strLength && j < 2) { 2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = dtStr[i]; 2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann k = k * 10 + FXSYS_toDecimalDigit(ch); 2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann j++; 2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!std::isdigit(ch)) 2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann i++; 2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_second = static_cast<uint8_t>(k); 2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i >= strLength || j < 2) 2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return *this; 2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = dtStr[i++]; 2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch != '-' && ch != '+') 2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return *this; 2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch == '-') 2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_tzHour = -1; 2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_tzHour = 1; 2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann j = 0; 2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann k = 0; 2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < strLength && j < 2) { 2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = dtStr[i]; 2404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann k = k * 10 + FXSYS_toDecimalDigit(ch); 2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann j++; 2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!std::isdigit(ch)) 2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann i++; 2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_tzHour *= static_cast<int8_t>(k); 2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i >= strLength || j < 2) 2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return *this; 2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (dtStr[i++] != '\'') 2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return *this; 2524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann j = 0; 2534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann k = 0; 2544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < strLength && j < 2) { 2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = dtStr[i]; 2564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann k = k * 10 + FXSYS_toDecimalDigit(ch); 2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann j++; 2584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!std::isdigit(ch)) 2594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 2604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann i++; 2614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_tzMinute = static_cast<uint8_t>(k); 2634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return *this; 2644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_ByteString CPDFSDK_DateTime::ToCommonDateTimeString() { 2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_ByteString str1; 2684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann str1.Format("%04d-%02u-%02u %02u:%02u:%02u ", m_year, m_month, m_day, m_hour, 2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_minute, m_second); 2704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_tzHour < 0) 2714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann str1 += "-"; 2724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 2734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann str1 += "+"; 2744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_ByteString str2; 2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann str2.Format("%02d:%02u", std::abs(static_cast<int>(m_tzHour)), m_tzMinute); 2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return str1 + str2; 2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_ByteString CPDFSDK_DateTime::ToPDFDateTimeString() { 2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_ByteString dtStr; 2814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann char tempStr[32]; 2824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann memset(tempStr, 0, sizeof(tempStr)); 2834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXSYS_snprintf(tempStr, sizeof(tempStr) - 1, "D:%04d%02u%02u%02u%02u%02u", 2844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_year, m_month, m_day, m_hour, m_minute, m_second); 2854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dtStr = CFX_ByteString(tempStr); 2864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_tzHour < 0) 2874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dtStr += CFX_ByteString("-"); 2884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 2894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dtStr += CFX_ByteString("+"); 2904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann memset(tempStr, 0, sizeof(tempStr)); 2914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXSYS_snprintf(tempStr, sizeof(tempStr) - 1, "%02d'%02u'", 2924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::abs(static_cast<int>(m_tzHour)), m_tzMinute); 2934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dtStr += CFX_ByteString(tempStr); 2944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return dtStr; 2954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDFSDK_DateTime::ToSystemTime(FX_SYSTEMTIME& st) { 2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann time_t t = this->ToTime_t(); 2994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann struct tm* pTime = localtime(&t); 3004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pTime) 3024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 3034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann st.wYear = static_cast<uint16_t>(pTime->tm_year) + 1900; 3054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann st.wMonth = static_cast<uint16_t>(pTime->tm_mon) + 1; 3064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann st.wDay = static_cast<uint16_t>(pTime->tm_mday); 3074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann st.wDayOfWeek = static_cast<uint16_t>(pTime->tm_wday); 3084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann st.wHour = static_cast<uint16_t>(pTime->tm_hour); 3094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann st.wMinute = static_cast<uint16_t>(pTime->tm_min); 3104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann st.wSecond = static_cast<uint16_t>(pTime->tm_sec); 3114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann st.wMilliseconds = 0; 3124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDFSDK_DateTime CPDFSDK_DateTime::ToGMT() const { 3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDFSDK_DateTime new_dt = *this; 3164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann new_dt.AddSeconds(-GetTimeZoneInSeconds(new_dt.m_tzHour, new_dt.m_tzMinute)); 3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann new_dt.m_tzHour = 0; 3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann new_dt.m_tzMinute = 0; 3194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return new_dt; 3204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDFSDK_DateTime& CPDFSDK_DateTime::AddDays(short days) { 3234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (days == 0) 3244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return *this; 3254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int16_t y = m_year; 3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t m = m_month; 3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t d = m_day; 3294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int ldays = days; 3314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ldays > 0) { 3324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int16_t yy = y; 3334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((static_cast<uint16_t>(m) * 100 + d) > 300) 3344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann yy++; 3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int ydays = GetYearDays(yy); 3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int mdays; 3374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (ldays >= ydays) { 3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann y++; 3394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ldays -= ydays; 3404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann yy++; 3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mdays = GetMonthDays(y, m); 3424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (d > mdays) { 3434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m++; 3444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann d -= mdays; 3454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ydays = GetYearDays(yy); 3474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mdays = GetMonthDays(y, m) - d + 1; 3494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (ldays >= mdays) { 3504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ldays -= mdays; 3514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m++; 3524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann d = 1; 3534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mdays = GetMonthDays(y, m); 3544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann d += ldays; 3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 3574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ldays *= -1; 3584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int16_t yy = y; 3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((static_cast<uint16_t>(m) * 100 + d) < 300) 3604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann yy--; 3614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int ydays = GetYearDays(yy); 3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (ldays >= ydays) { 3634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann y--; 3644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ldays -= ydays; 3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann yy--; 3664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int mdays = GetMonthDays(y, m); 3674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (d > mdays) { 3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m++; 3694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann d -= mdays; 3704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ydays = GetYearDays(yy); 3724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (ldays >= d) { 3744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ldays -= d; 3754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m--; 3764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann d = GetMonthDays(y, m); 3774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann d -= ldays; 3794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_year = y; 3824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_month = m; 3834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_day = d; 3844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return *this; 3864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDFSDK_DateTime& CPDFSDK_DateTime::AddSeconds(int seconds) { 3894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (seconds == 0) 3904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return *this; 3914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int n; 3934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int days; 3944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann n = m_hour * 3600 + m_minute * 60 + m_second + seconds; 3964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (n < 0) { 3974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann days = (n - 86399) / 86400; 3984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann n -= days * 86400; 3994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 4004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann days = n / 86400; 4014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann n %= 86400; 4024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_hour = static_cast<uint8_t>(n / 3600); 4044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_hour %= 24; 4054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann n %= 3600; 4064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_minute = static_cast<uint8_t>(n / 60); 4074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_second = static_cast<uint8_t>(n % 60); 4084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (days != 0) 4094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann AddDays(days); 4104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return *this; 4124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 413