aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dateTime.cpp24
-rw-r--r--src/utility/datetimeUtils.cpp31
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