14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2014 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 "core/fxcrt/fx_system.h" 84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fgas/localization/fgas_datetime.h" 94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#if _FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_ANDROID_ || \ 114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_IOS_ 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <sys/time.h> 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <time.h> 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif 154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst uint8_t g_FXDaysPerMonth[12] = {31, 28, 31, 30, 31, 30, 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 31, 31, 30, 31, 30, 31}; 184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst uint8_t g_FXDaysPerLeapMonth[12] = {31, 29, 31, 30, 31, 30, 194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 31, 31, 30, 31, 30, 31}; 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst int32_t g_FXDaysBeforeMonth[12] = {0, 31, 59, 90, 120, 151, 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 181, 212, 243, 273, 304, 334}; 224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst int32_t g_FXDaysBeforeLeapMonth[12] = {0, 31, 60, 91, 121, 152, 234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 182, 213, 244, 274, 305, 335}; 244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst int32_t g_FXDaysPerYear = 365; 254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst int32_t g_FXDaysPerLeapYear = 366; 264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst int32_t g_FXDaysPer4Years = 1461; 274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst int32_t g_FXDaysPer100Years = 36524; 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst int32_t g_FXDaysPer400Years = 146097; 294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst int64_t g_FXMillisecondsPerSecond = 1000; 304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst int64_t g_FXMillisecondsPerMinute = 60000; 314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst int64_t g_FXMillisecondsPerHour = 3600000; 324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst int64_t g_FXMillisecondsPerDay = 86400000; 334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool FX_IsLeapYear(int32_t iYear) { 344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(iYear != 0); 354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ((iYear % 4) == 0 && (iYear % 100) != 0) || (iYear % 400) == 0; 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t FX_DaysInYear(int32_t iYear) { 384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(iYear != 0); 394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return FX_IsLeapYear(iYear) ? g_FXDaysPerLeapYear : g_FXDaysPerYear; 404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint8_t FX_DaysInMonth(int32_t iYear, uint8_t iMonth) { 424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(iYear != 0); 434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(iMonth >= 1 && iMonth <= 12); 444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const uint8_t* p = 454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_IsLeapYear(iYear) ? g_FXDaysPerLeapMonth : g_FXDaysPerMonth; 464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return p[iMonth - 1]; 474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstatic int32_t FX_DaysBeforeMonthInYear(int32_t iYear, uint8_t iMonth) { 494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(iYear != 0); 504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(iMonth >= 1 && iMonth <= 12); 514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const int32_t* p = 524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_IsLeapYear(iYear) ? g_FXDaysBeforeLeapMonth : g_FXDaysBeforeMonth; 534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return p[iMonth - 1]; 544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstatic int64_t FX_DateToDays(int32_t iYear, 564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t iMonth, 574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t iDay, 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bIncludeThisDay = false) { 594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(iYear != 0); 604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(iMonth >= 1 && iMonth <= 12); 614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(iDay >= 1 && iDay <= FX_DaysInMonth(iYear, iMonth)); 624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int64_t iDays = FX_DaysBeforeMonthInYear(iYear, iMonth); 634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDays += iDay; 644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!bIncludeThisDay) { 654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDays--; 664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iYear > 0) { 684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iYear--; 694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDays -= FX_DaysInYear(iYear); 714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iYear++; 724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return iDays + (int64_t)iYear * 365 + iYear / 4 - iYear / 100 + iYear / 400; 744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstatic void FX_DaysToDate(int64_t iDays, 764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t& iYear, 774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t& iMonth, 784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t& iDay) { 794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bBC = iDays < 0; 804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bBC) { 814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDays = -iDays; 824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iYear = 1; 844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMonth = 1; 854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDay = 1; 864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iDays >= g_FXDaysPer400Years) { 874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iYear += (int32_t)(iDays / g_FXDaysPer400Years * 400); 884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDays %= g_FXDaysPer400Years; 894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iDays >= g_FXDaysPer100Years) { 914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iDays == g_FXDaysPer100Years * 4) { 924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iYear += 300; 934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDays -= g_FXDaysPer100Years * 3; 944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iYear += (int32_t)(iDays / g_FXDaysPer100Years * 100); 964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDays %= g_FXDaysPer100Years; 974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iDays >= g_FXDaysPer4Years) { 1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iYear += (int32_t)(iDays / g_FXDaysPer4Years * 4); 1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDays %= g_FXDaysPer4Years; 1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (true) { 1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iYearDays = FX_DaysInYear(iYear); 1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iDays < iYearDays) { 1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bBC) { 1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iYear = -iYear; 1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDays = iYearDays - iDays; 1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iYear++; 1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDays -= iYearDays; 1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (true) { 1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iMonthDays = FX_DaysInMonth(iYear, iMonth); 1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iDays < iMonthDays) { 1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMonth++; 1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDays -= iMonthDays; 1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDay += (uint8_t)iDays; 1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstruct FXUT_SYSTEMTIME { 1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint16_t wYear; 1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint16_t wMonth; 1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint16_t wDayOfWeek; 1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint16_t wDay; 1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint16_t wHour; 1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint16_t wMinute; 1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint16_t wSecond; 1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint16_t wMilliseconds; 1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}; 1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_Unitime::Now() { 1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXUT_SYSTEMTIME utLocal; 1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || \ 1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _FX_OS_ == _FX_WIN64_ 1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ::GetLocalTime((LPSYSTEMTIME)&utLocal); 1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#elif _FX_OS_ != _FX_EMBEDDED_ 1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#if 1 1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann timeval curTime; 1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann gettimeofday(&curTime, nullptr); 1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#else 1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann struct timespec curTime; 1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &curTime); 1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif 1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann struct tm st; 1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann localtime_r(&curTime.tv_sec, &st); 1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann utLocal.wYear = st.tm_year + 1900; 1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann utLocal.wMonth = st.tm_mon + 1; 1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann utLocal.wDayOfWeek = st.tm_wday; 1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann utLocal.wDay = st.tm_mday; 1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann utLocal.wHour = st.tm_hour; 1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann utLocal.wMinute = st.tm_min; 1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann utLocal.wSecond = st.tm_sec; 1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann utLocal.wMilliseconds = curTime.tv_usec / 1000; 1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif 1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Set(utLocal.wYear, (uint8_t)utLocal.wMonth, (uint8_t)utLocal.wDay, 1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (uint8_t)utLocal.wHour, (uint8_t)utLocal.wMinute, 1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (uint8_t)utLocal.wSecond, (uint16_t)utLocal.wMilliseconds); 1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_Unitime::SetGMTime() { 1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXUT_SYSTEMTIME utLocal; 1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || \ 1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann _FX_OS_ == _FX_WIN64_ 1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ::GetSystemTime((LPSYSTEMTIME)&utLocal); 1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#elif _FX_OS_ != _FX_EMBEDDED_ 1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#if 1 1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann timeval curTime; 1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann gettimeofday(&curTime, nullptr); 1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#else 1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann struct timespec curTime; 1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &curTime); 1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif 1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann struct tm st; 1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann gmtime_r(&curTime.tv_sec, &st); 1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann utLocal.wYear = st.tm_year + 1900; 1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann utLocal.wMonth = st.tm_mon + 1; 1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann utLocal.wDayOfWeek = st.tm_wday; 1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann utLocal.wDay = st.tm_mday; 1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann utLocal.wHour = st.tm_hour; 1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann utLocal.wMinute = st.tm_min; 1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann utLocal.wSecond = st.tm_sec; 1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann utLocal.wMilliseconds = curTime.tv_usec / 1000; 1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif 1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Set(utLocal.wYear, (uint8_t)utLocal.wMonth, (uint8_t)utLocal.wDay, 1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (uint8_t)utLocal.wHour, (uint8_t)utLocal.wMinute, 1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (uint8_t)utLocal.wSecond, (uint16_t)utLocal.wMilliseconds); 1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_Unitime::Set(int32_t year, 1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t month, 1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t day, 1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t hour, 1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t minute, 1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t second, 1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint16_t millisecond) { 2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(hour <= 23); 2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(minute <= 59); 2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(second <= 59); 2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(millisecond <= 999); 2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iUnitime = (int64_t)hour * g_FXMillisecondsPerHour + 2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (int64_t)minute * g_FXMillisecondsPerMinute + 2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (int64_t)second * g_FXMillisecondsPerSecond + millisecond; 2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (year > 0) { 2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iUnitime = 2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iUnitime + 2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_DateToDays(year, month, day, false) * g_FXMillisecondsPerDay; 2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFX_Unitime::Set(FX_UNITIME t) { 2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iUnitime = t; 2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CFX_Unitime::GetYear() const { 2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iYear; 2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t iMonth, iDay; 2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay); 2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return iYear; 2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint8_t CFX_Unitime::GetMonth() const { 2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iYear; 2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t iMonth, iDay; 2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay); 2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return iMonth; 2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint8_t CFX_Unitime::GetDay() const { 2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iYear; 2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t iMonth, iDay; 2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay); 2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return iDay; 2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WEEKDAY CFX_Unitime::GetDayOfWeek() const { 2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t v = (int32_t)((m_iUnitime / g_FXMillisecondsPerDay + 1) % 7); 2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (v < 0) { 2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v += 7; 2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return (FX_WEEKDAY)v; 2404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint16_t CFX_Unitime::GetDayOfYear() const { 2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iYear; 2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t iMonth, iDay; 2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay); 2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return FX_DaysBeforeMonthInYear(iYear, iMonth) + iDay; 2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint64_t CFX_Unitime::GetDayOfAD() const { 2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bBC = m_iUnitime < 0; 2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int64_t iDays = m_iUnitime / g_FXMillisecondsPerDay; 2504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDays += bBC ? -1 : 0; 2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bBC && (m_iUnitime % g_FXMillisecondsPerDay) == 0) { 2524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDays++; 2534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return iDays; 2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint8_t CFX_Unitime::GetHour() const { 2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t v = (int32_t)(m_iUnitime % g_FXMillisecondsPerDay); 2584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (v < 0) { 2594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v += g_FXMillisecondsPerDay; 2604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return (uint8_t)(v / g_FXMillisecondsPerHour); 2624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint8_t CFX_Unitime::GetMinute() const { 2644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t v = (int32_t)(m_iUnitime % g_FXMillisecondsPerHour); 2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (v < 0) { 2664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v += g_FXMillisecondsPerHour; 2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return (uint8_t)(v / g_FXMillisecondsPerMinute); 2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint8_t CFX_Unitime::GetSecond() const { 2714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t v = (int32_t)(m_iUnitime % g_FXMillisecondsPerMinute); 2724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (v < 0) { 2734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v += g_FXMillisecondsPerMinute; 2744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return (uint8_t)(v / g_FXMillisecondsPerSecond); 2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint16_t CFX_Unitime::GetMillisecond() const { 2784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t v = (int32_t)(m_iUnitime % g_FXMillisecondsPerSecond); 2794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (v < 0) { 2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v += g_FXMillisecondsPerSecond; 2814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return (uint16_t)v; 2834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CFX_Unitime::AddYears(int32_t iYears) { 2854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_UNITIME ut = m_iUnitime; 2864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ut < 0) { 2874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ut = -ut; 2884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_UNITIME r = ut % g_FXMillisecondsPerDay; 2904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iYear; 2914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t iMonth, iDay; 2924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay); 2934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iYear += iYears; 2944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iYear == 0) { 2954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iYear = iYears > 0 ? 1 : -1; 2964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iUnitime = 2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_DateToDays(iYear, iMonth, iDay, false) * g_FXMillisecondsPerDay; 2994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iUnitime += (iYear < 0) ? -r : r; 3004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 3014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CFX_Unitime::AddMonths(int32_t iMonths) { 3034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool b = iMonths > 0; 3044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_UNITIME ut = m_iUnitime; 3054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ut < 0) { 3064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ut = -ut; 3074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_UNITIME r = ut % g_FXMillisecondsPerDay; 3094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iYear; 3104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t iMonth, iDay; 3114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_DaysToDate(GetDayOfAD(), iYear, iMonth, iDay); 3124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMonths += iMonth; 3134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iMonths < 1) { 3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iYear--, iMonths += 12; 3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iMonths > 12) { 3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iYear++, iMonths -= 12; 3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iYear == 0) { 3204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iYear = b ? 1 : -1; 3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iUnitime = FX_DateToDays(iYear, (uint8_t)iMonths, iDay, false) * 3234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann g_FXMillisecondsPerDay; 3244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iUnitime += (iYear < 0) ? -r : r; 3254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 3264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CFX_Unitime::AddDays(int32_t iDays) { 3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iUnitime += (int64_t)iDays * g_FXMillisecondsPerDay; 3294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 3304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CFX_Unitime::AddHours(int32_t iHours) { 3324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iUnitime += (int64_t)iHours * g_FXMillisecondsPerHour; 3334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 3344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CFX_Unitime::AddMinutes(int32_t iMinutes) { 3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iUnitime += (int64_t)iMinutes * g_FXMillisecondsPerMinute; 3374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CFX_Unitime::AddSeconds(int32_t iSeconds) { 3404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iUnitime += ((int64_t)iSeconds) * g_FXMillisecondsPerSecond; 3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 3424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CFX_Unitime::AddMilliseconds(int32_t iMilliseconds) { 3444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_iUnitime += iMilliseconds; 3454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 3464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CFX_DateTime::Set(int32_t year, 3484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t month, 3494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t day, 3504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t hour, 3514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t minute, 3524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t second, 3534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint16_t millisecond) { 3544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(year != 0); 3554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(month >= 1 && month <= 12); 3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(day >= 1 && day <= FX_DaysInMonth(year, month)); 3574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(hour <= 23); 3584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(minute <= 59); 3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(second <= 59); 3604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(millisecond <= 999); 3614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Date.sDate.year = year; 3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Date.sDate.month = month; 3634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Date.sDate.day = day; 3644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Time.sTime.hour = hour; 3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Time.sTime.minute = minute; 3664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Time.sTime.second = second; 3674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Time.sTime.millisecond = millisecond; 3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 3694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CFX_DateTime::FromUnitime(FX_UNITIME t) { 3714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_Unitime ut(t); 3724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_DaysToDate(ut.GetDayOfAD(), m_DateTime.Date.sDate.year, 3734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Date.sDate.month, m_DateTime.Date.sDate.day); 3744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Date.sDate.day = ut.GetHour(); 3754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Time.sTime.minute = ut.GetMinute(); 3764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Time.sTime.second = ut.GetSecond(); 3774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Time.sTime.millisecond = ut.GetMillisecond(); 3784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 3794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_UNITIME CFX_DateTime::ToUnitime() const { 3814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_UNITIME v = 3824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (int64_t)m_DateTime.Date.sDate.day * g_FXMillisecondsPerHour + 3834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (int64_t)m_DateTime.Time.sTime.minute * g_FXMillisecondsPerMinute + 3844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (int64_t)m_DateTime.Time.sTime.second * g_FXMillisecondsPerSecond + 3854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Time.sTime.millisecond; 3864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v += FX_DateToDays(m_DateTime.Date.sDate.year, m_DateTime.Date.sDate.month, 3874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Date.sDate.day, false) * 3884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann g_FXMillisecondsPerDay; 3894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return v; 3904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CFX_DateTime::GetYear() const { 3924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_DateTime.Date.sDate.year; 3934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint8_t CFX_DateTime::GetMonth() const { 3954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_DateTime.Date.sDate.month; 3964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint8_t CFX_DateTime::GetDay() const { 3984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_DateTime.Date.sDate.day; 3994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WEEKDAY CFX_DateTime::GetDayOfWeek() const { 4014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t v = (int32_t)(FX_DateToDays(m_DateTime.Date.sDate.year, 4024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Date.sDate.month, 4034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Date.sDate.day, true) % 4044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7); 4054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (v < 0) { 4064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v += 7; 4074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return (FX_WEEKDAY)v; 4094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint16_t CFX_DateTime::GetDayOfYear() const { 4114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return FX_DaysBeforeMonthInYear(m_DateTime.Date.sDate.year, 4124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Date.sDate.month) + 4134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Date.sDate.day; 4144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint64_t CFX_DateTime::GetDayOfAD() const { 4164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return FX_DateToDays(m_DateTime.Date.sDate.year, m_DateTime.Date.sDate.month, 4174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Date.sDate.day, true); 4184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint8_t CFX_DateTime::GetHour() const { 4204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_DateTime.Date.sDate.day; 4214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint8_t CFX_DateTime::GetMinute() const { 4234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_DateTime.Time.sTime.minute; 4244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint8_t CFX_DateTime::GetSecond() const { 4264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_DateTime.Time.sTime.second; 4274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint16_t CFX_DateTime::GetMillisecond() const { 4294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_DateTime.Time.sTime.millisecond; 4304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CFX_DateTime::AddYears(int32_t iYears) { 4324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iYears == 0) { 4334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 4344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t v = m_DateTime.Date.sDate.year + iYears; 4364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (v >= 0 && m_DateTime.Date.sDate.year < 0) { 4374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v++; 4384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (v <= 0 && m_DateTime.Date.sDate.year > 0) { 4394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v--; 4404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Date.sDate.year = v; 4424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 4434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CFX_DateTime::AddMonths(int32_t iMonths) { 4454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iMonths == 0) { 4464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 4474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool b = iMonths > 0; 4494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMonths += m_DateTime.Date.sDate.month; 4504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iMonths < 1) { 4514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Date.sDate.year--; 4524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_DateTime.Date.sDate.year == 0) { 4534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Date.sDate.year = -1; 4544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMonths += 12; 4564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iMonths > 12) { 4584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Date.sDate.year++; 4594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_DateTime.Date.sDate.year == 0) { 4604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Date.sDate.year = 1; 4614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMonths -= 12; 4634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_DateTime.Date.sDate.year == 0) { 4654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Date.sDate.year = b ? 1 : -1; 4664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Date.sDate.month = (uint8_t)iMonths; 4684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 4694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CFX_DateTime::AddDays(int32_t iDays) { 4714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iDays == 0) { 4724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 4734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int64_t v1 = 4754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_DateToDays(m_DateTime.Date.sDate.year, m_DateTime.Date.sDate.month, 4764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Date.sDate.day, true); 4774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int64_t v2 = v1 + iDays; 4784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (v2 <= 0 && v1 > 0) { 4794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v2--; 4804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (v2 >= 0 && v1 < 0) { 4814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v2++; 4824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_DaysToDate(v2, m_DateTime.Date.sDate.year, m_DateTime.Date.sDate.month, 4844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Date.sDate.day); 4854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 4864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CFX_DateTime::AddHours(int32_t iHours) { 4884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iHours == 0) { 4894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 4904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iHours += m_DateTime.Date.sDate.day; 4924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iDays = iHours / 24; 4934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iHours %= 24; 4944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iHours < 0) { 4954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDays--, iHours += 24; 4964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Date.sDate.day = (uint8_t)iHours; 4984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iDays != 0) { 4994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann AddDays(iDays); 5004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 5024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 5034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CFX_DateTime::AddMinutes(int32_t iMinutes) { 5044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iMinutes == 0) { 5054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 5064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMinutes += m_DateTime.Time.sTime.minute; 5084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iHours = iMinutes / 60; 5094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMinutes %= 60; 5104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iMinutes < 0) { 5114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iHours--, iMinutes += 60; 5124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Time.sTime.minute = (uint8_t)iMinutes; 5144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iHours != 0) { 5154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann AddHours(iHours); 5164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 5184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 5194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CFX_DateTime::AddSeconds(int32_t iSeconds) { 5204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iSeconds == 0) { 5214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 5224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iSeconds += m_DateTime.Time.sTime.second; 5244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iMinutes = iSeconds / 60; 5254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iSeconds %= 60; 5264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iSeconds < 0) { 5274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMinutes--, iSeconds += 60; 5284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Time.sTime.second = (uint8_t)iSeconds; 5304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iMinutes != 0) { 5314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann AddMinutes(iMinutes); 5324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 5344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 5354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CFX_DateTime::AddMilliseconds(int32_t iMilliseconds) { 5364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iMilliseconds == 0) { 5374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 5384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMilliseconds += m_DateTime.Time.sTime.millisecond; 5404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iSeconds = (int32_t)(iMilliseconds / g_FXMillisecondsPerSecond); 5414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMilliseconds %= g_FXMillisecondsPerSecond; 5424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iMilliseconds < 0) { 5434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iSeconds--, iMilliseconds += g_FXMillisecondsPerSecond; 5444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DateTime.Time.sTime.millisecond = (uint16_t)iMilliseconds; 5464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iSeconds != 0) { 5474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann AddSeconds(iSeconds); 5484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 5504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 551