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