diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/dateTime.cpp | 24 | ||||
-rw-r--r-- | src/utility/datetimeUtils.cpp | 31 |
2 files changed, 33 insertions, 22 deletions
diff --git a/src/dateTime.cpp b/src/dateTime.cpp index 1e2c6a29..1af0554e 100644 --- a/src/dateTime.cpp +++ b/src/dateTime.cpp @@ -806,8 +806,8 @@ void datetime::setZone(const int zone) { m_zone = zone; } const bool datetime::operator==(const datetime& other) const { - const datetime ut1 = utility::datetimeUtils::localTimeToUniversalTime(*this); - const datetime ut2 = utility::datetimeUtils::localTimeToUniversalTime(other); + const datetime ut1 = utility::datetimeUtils::toUniversalTime(*this); + const datetime ut2 = utility::datetimeUtils::toUniversalTime(other); return (ut1.m_year == ut2.m_year && ut1.m_month == ut2.m_month && @@ -820,8 +820,8 @@ const bool datetime::operator==(const datetime& other) const const bool datetime::operator!=(const datetime& other) const { - const datetime ut1 = utility::datetimeUtils::localTimeToUniversalTime(*this); - const datetime ut2 = utility::datetimeUtils::localTimeToUniversalTime(other); + const datetime ut1 = utility::datetimeUtils::toUniversalTime(*this); + const datetime ut2 = utility::datetimeUtils::toUniversalTime(other); return (ut1.m_year != ut2.m_year || ut1.m_month != ut2.m_month || @@ -834,8 +834,8 @@ const bool datetime::operator!=(const datetime& other) const const bool datetime::operator<(const datetime& other) const { - const datetime ut1 = utility::datetimeUtils::localTimeToUniversalTime(*this); - const datetime ut2 = utility::datetimeUtils::localTimeToUniversalTime(other); + const datetime ut1 = utility::datetimeUtils::toUniversalTime(*this); + const datetime ut2 = utility::datetimeUtils::toUniversalTime(other); return ((ut1.m_year < ut2.m_year) || ((ut1.m_year == ut2.m_year) && ((ut1.m_month < ut2.m_month) || @@ -848,8 +848,8 @@ const bool datetime::operator<(const datetime& other) const const bool datetime::operator<=(const datetime& other) const { - const datetime ut1 = utility::datetimeUtils::localTimeToUniversalTime(*this); - const datetime ut2 = utility::datetimeUtils::localTimeToUniversalTime(other); + const datetime ut1 = utility::datetimeUtils::toUniversalTime(*this); + const datetime ut2 = utility::datetimeUtils::toUniversalTime(other); return ((ut1.m_year < ut2.m_year) || ((ut1.m_year == ut2.m_year) && ((ut1.m_month < ut2.m_month) || @@ -862,8 +862,8 @@ const bool datetime::operator<=(const datetime& other) const const bool datetime::operator>(const datetime& other) const { - const datetime ut1 = utility::datetimeUtils::localTimeToUniversalTime(*this); - const datetime ut2 = utility::datetimeUtils::localTimeToUniversalTime(other); + const datetime ut1 = utility::datetimeUtils::toUniversalTime(*this); + const datetime ut2 = utility::datetimeUtils::toUniversalTime(other); return ((ut1.m_year > ut2.m_year) || ((ut1.m_year == ut2.m_year) && ((ut1.m_month > ut2.m_month) || @@ -876,8 +876,8 @@ const bool datetime::operator>(const datetime& other) const const bool datetime::operator>=(const datetime& other) const { - const datetime ut1 = utility::datetimeUtils::localTimeToUniversalTime(*this); - const datetime ut2 = utility::datetimeUtils::localTimeToUniversalTime(other); + const datetime ut1 = utility::datetimeUtils::toUniversalTime(*this); + const datetime ut2 = utility::datetimeUtils::toUniversalTime(other); return ((ut1.m_year > ut2.m_year) || ((ut1.m_year == ut2.m_year) && ((ut1.m_month > ut2.m_month) || diff --git a/src/utility/datetimeUtils.cpp b/src/utility/datetimeUtils.cpp index c990a2ac..3bec7dbf 100644 --- a/src/utility/datetimeUtils.cpp +++ b/src/utility/datetimeUtils.cpp @@ -19,6 +19,8 @@ #include "vmime/utility/datetimeUtils.hpp" +#include <stdexcept> + namespace vmime { namespace utility { @@ -157,10 +159,10 @@ static inline void substractHoursAndMinutes(datetime& d, const int h, const int #endif // VMIME_BUILDING_DOC -const datetime datetimeUtils::localTimeToUniversalTime(const datetime& date) +const datetime datetimeUtils::toUniversalTime(const datetime& date) { if (date.getZone() == datetime::GMT) - return (date); + return date; // no conversion needed datetime nd(date); nd.setZone(datetime::GMT); @@ -178,19 +180,20 @@ const datetime datetimeUtils::localTimeToUniversalTime(const datetime& date) } -const datetime datetimeUtils::universalTimeToLocalTime(const datetime& date, const int zone) +const datetime datetimeUtils::toLocalTime(const datetime& date, const int zone) { - if (zone == 0) - return (date); + datetime utcDate(date); - datetime nd(date); + if (utcDate.getZone() != datetime::GMT) + utcDate = toUniversalTime(date); // convert to UT before + + datetime nd(utcDate); nd.setZone(zone); - const int z = zone; - const int h = (z < 0) ? (-z / 60) : (z / 60); - const int m = (z < 0) ? (-z - h * 60) : (z - h * 60); + const int h = (zone < 0) ? (-zone / 60) : (zone / 60); + const int m = (zone < 0) ? (-zone - h * 60) : (zone - h * 60); - if (z < 0) // GMT+hhmm: substract hours and minutes from date + if (zone < 0) // GMT+hhmm: substract hours and minutes from date substractHoursAndMinutes(nd, h, m); else // GMT-hhmm: add hours and minutes to date addHoursAndMinutes(nd, h, m); @@ -213,6 +216,9 @@ const int datetimeUtils::getDaysInMonth(const int year, const int month) static const int daysInMonthLeapYear[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + if (month < 1 || month > 12) + throw std::out_of_range("Invalid month number"); + return (isLeapYear(year) ? daysInMonthLeapYear[month - 1] : daysInMonth[month - 1]); } @@ -222,6 +228,11 @@ const int datetimeUtils::getDayOfWeek(const int year, const int month, const int int y = year; int m = month; + if (month < 1 || month > 12) + throw std::out_of_range("Invalid month number"); + else if (day < 1 || day > getDaysInMonth(year, month)) + throw std::out_of_range("Invalid day number"); + // From RFC-3339 - Appendix B. Day of the Week // Adjust months so February is the last one |