diff --git a/chrono/datetime.cpp b/chrono/datetime.cpp index 93d5f07..67a2d78 100644 --- a/chrono/datetime.cpp +++ b/chrono/datetime.cpp @@ -110,9 +110,9 @@ DateTime DateTime::fromString(const char *str) } /*! - * \brief Parses the given ISO date time denotation provided as C-style string. - * \returns Returns a pair where the first value is the parsed UTC DateTime and the second value - * a TimeSpan which can be added to the first value to get the local DateTime. + * \brief Parses the specified ISO date time denotation provided as C-style string. + * \returns Returns a pair where the first value is the parsed date time and the second value + * a time span which can be subtracted from the first value to get the UTC time. * \remarks Not sure whether it is actually ISO conform, but it parses denotations like * "2016-08-29T21:32:31.588539814+02:00". */ @@ -297,7 +297,7 @@ uint64 DateTime::dateToTicks(int year, int month, int day) if(inRangeInclMax(day, 1, daysToMonth[month] - daysToMonth[passedMonth])) { int passedYears = year - 1; int passedDays = day - 1; - return (passedYears * m_daysPerYear + passedYears / 4 - passedYears / 100 + passedYears / 400 + daysToMonth[passedMonth] + passedDays) * TimeSpan::m_ticksPerDay; + return (passedYears * m_daysPerYear + passedYears / 4 - passedYears / 100 + passedYears / 400 + daysToMonth[passedMonth] + passedDays) * TimeSpan::ticksPerDay; } else { throw ConversionException("day is out of range"); } @@ -327,7 +327,7 @@ uint64 DateTime::timeToTicks(int hour, int minute, int second, double millisecon if(!inRangeExclMax(millisecond, 0.0, 1000.0)) { throw ConversionException("millisecond is out of range"); } - return (hour * TimeSpan::m_ticksPerHour) + (minute * TimeSpan::m_ticksPerMinute) + (second * TimeSpan::m_ticksPerSecond) + (uint64)(millisecond * (double)TimeSpan::m_ticksPerMillisecond); + return (hour * TimeSpan::ticksPerHour) + (minute * TimeSpan::ticksPerMinute) + (second * TimeSpan::ticksPerSecond) + (uint64)(millisecond * (double)TimeSpan::ticksPerMillisecond); } /*! @@ -336,7 +336,7 @@ uint64 DateTime::timeToTicks(int hour, int minute, int second, double millisecon */ int DateTime::getDatePart(DatePart part) const { - int fullDays = m_ticks / TimeSpan::m_ticksPerDay; + int fullDays = m_ticks / TimeSpan::ticksPerDay; int full400YearBlocks = fullDays / m_daysPer400Years; int daysMinusFull400YearBlocks = fullDays - full400YearBlocks * m_daysPer400Years; int full100YearBlocks = daysMinusFull400YearBlocks / m_daysPer100Years; diff --git a/chrono/datetime.h b/chrono/datetime.h index 7f96160..a7fc363 100644 --- a/chrono/datetime.h +++ b/chrono/datetime.h @@ -63,6 +63,8 @@ public: static DateTime fromString(const std::string &str); static DateTime fromString(const char *str); static std::pair fromIsoString(const char *str); + static DateTime fromIsoStringGmt(const char *str); + static DateTime fromIsoStringLocal(const char *str); static DateTime fromTimeStamp(time_t timeStamp); static DateTime fromTimeStampGmt(time_t timeStamp); @@ -83,7 +85,7 @@ public: constexpr bool isSameDay(const DateTime &other) const; std::string toString(DateTimeOutputFormat format = DateTimeOutputFormat::DateAndTime, bool noMilliseconds = false) const; void toString(std::string &result, DateTimeOutputFormat format = DateTimeOutputFormat::DateAndTime, bool noMilliseconds = false) const; - std::string toIsoString(TimeSpan delta) const; + std::string toIsoString(TimeSpan timeZoneDelta = TimeSpan()) const; static const char *printDayOfWeek(DayOfWeek dayOfWeek, bool abbreviation = false); static constexpr DateTime eternity(); @@ -175,6 +177,27 @@ inline DateTime DateTime::fromString(const std::string &str) return fromString(str.data()); } +/*! + * \brief Parses the specified ISO date time denotation provided as C-style string. + * \returns Returns the parsed UTC time. That means a possibly denoted time zone delta is subtracted from the time stamp. + * \sa fromIsoString() + */ +inline DateTime DateTime::fromIsoStringGmt(const char *str) +{ + const auto tmp = fromIsoString(str); + return tmp.first - tmp.second; +} + +/*! + * \brief Parses the specified ISO date time denotation provided as C-style string. + * \returns Returns the parsed local time. That means a possibly denoted time zone delta is discarded. + * \sa fromIsoString() + */ +inline DateTime DateTime::fromIsoStringLocal(const char *str) +{ + return fromIsoString(str).first; +} + /*! * \brief Gets the number of ticks which represent the value of the current instance. */ @@ -221,7 +244,7 @@ inline int DateTime::dayOfYear() const */ constexpr inline DayOfWeek DateTime::dayOfWeek() const { - return static_cast((m_ticks / TimeSpan::m_ticksPerDay) % 7l); + return static_cast((m_ticks / TimeSpan::ticksPerDay) % 7l); } /*! @@ -229,7 +252,7 @@ constexpr inline DayOfWeek DateTime::dayOfWeek() const */ constexpr inline int DateTime::hour() const { - return m_ticks / TimeSpan::m_ticksPerHour % 24ul; + return m_ticks / TimeSpan::ticksPerHour % 24ul; } /*! @@ -237,7 +260,7 @@ constexpr inline int DateTime::hour() const */ constexpr inline int DateTime::minute() const { - return m_ticks / TimeSpan::m_ticksPerMinute % 60ul; + return m_ticks / TimeSpan::ticksPerMinute % 60ul; } /*! @@ -245,7 +268,7 @@ constexpr inline int DateTime::minute() const */ constexpr inline int DateTime::second() const { - return m_ticks / TimeSpan::m_ticksPerSecond % 60ul; + return m_ticks / TimeSpan::ticksPerSecond % 60ul; } /*! @@ -253,7 +276,7 @@ constexpr inline int DateTime::second() const */ constexpr inline int DateTime::millisecond() const { - return m_ticks / TimeSpan::m_ticksPerMillisecond % 1000ul; + return m_ticks / TimeSpan::ticksPerMillisecond % 1000ul; } /*! @@ -270,7 +293,7 @@ constexpr inline bool DateTime::isNull() const */ constexpr inline TimeSpan DateTime::timeOfDay() const { - return TimeSpan(m_ticks % TimeSpan::m_ticksPerDay); + return TimeSpan(m_ticks % TimeSpan::ticksPerDay); } /*! @@ -318,7 +341,7 @@ inline int DateTime::daysInMonth(int year, int month) */ constexpr inline bool DateTime::isSameDay(const DateTime &other) const { - return (m_ticks / TimeSpan::m_ticksPerDay) == (other.m_ticks / TimeSpan::m_ticksPerDay); + return (m_ticks / TimeSpan::ticksPerDay) == (other.m_ticks / TimeSpan::ticksPerDay); } /*! diff --git a/chrono/timespan.h b/chrono/timespan.h index 12efb9b..109bee7 100644 --- a/chrono/timespan.h +++ b/chrono/timespan.h @@ -73,13 +73,14 @@ public: constexpr bool isNegativeInfinity() const; constexpr bool isInfinity() const; + static constexpr uint64 ticksPerMillisecond = 10000uL; + static constexpr uint64 ticksPerSecond = 10000000uL; + static constexpr uint64 ticksPerMinute = 600000000uL; + static constexpr uint64 ticksPerHour = 36000000000uL; + static constexpr uint64 ticksPerDay = 864000000000uL; + private: int64 m_ticks; - static constexpr uint64 m_ticksPerMillisecond = 10000uL; - static constexpr uint64 m_ticksPerSecond = 10000000uL; - static constexpr uint64 m_ticksPerMinute = 600000000uL; - static constexpr uint64 m_ticksPerHour = 36000000000uL; - static constexpr uint64 m_ticksPerDay = 864000000000uL; }; /*! @@ -99,7 +100,7 @@ constexpr inline TimeSpan::TimeSpan(int64 ticks) : m_ticks(ticks) */ constexpr inline TimeSpan TimeSpan::fromMilliseconds(double milliseconds) { - return TimeSpan(static_cast(milliseconds * static_cast(m_ticksPerMillisecond))); + return TimeSpan(static_cast(milliseconds * static_cast(ticksPerMillisecond))); } /*! @@ -107,7 +108,7 @@ constexpr inline TimeSpan TimeSpan::fromMilliseconds(double milliseconds) */ constexpr inline TimeSpan TimeSpan::fromSeconds(double seconds) { - return TimeSpan(static_cast(seconds * static_cast(m_ticksPerSecond))); + return TimeSpan(static_cast(seconds * static_cast(ticksPerSecond))); } /*! @@ -115,7 +116,7 @@ constexpr inline TimeSpan TimeSpan::fromSeconds(double seconds) */ constexpr inline TimeSpan TimeSpan::fromMinutes(double minutes) { - return TimeSpan(static_cast(minutes * static_cast(m_ticksPerMinute))); + return TimeSpan(static_cast(minutes * static_cast(ticksPerMinute))); } /*! @@ -123,7 +124,7 @@ constexpr inline TimeSpan TimeSpan::fromMinutes(double minutes) */ constexpr inline TimeSpan TimeSpan::fromHours(double hours) { - return TimeSpan(static_cast(hours * static_cast(m_ticksPerHour))); + return TimeSpan(static_cast(hours * static_cast(ticksPerHour))); } /*! @@ -131,7 +132,7 @@ constexpr inline TimeSpan TimeSpan::fromHours(double hours) */ constexpr inline TimeSpan TimeSpan::fromDays(double days) { - return TimeSpan(static_cast(days * static_cast(m_ticksPerDay))); + return TimeSpan(static_cast(days * static_cast(ticksPerDay))); } /*! @@ -171,7 +172,7 @@ constexpr inline int64 TimeSpan::totalTicks() const */ constexpr inline double TimeSpan::totalMilliseconds() const { - return static_cast(m_ticks) / static_cast(m_ticksPerMillisecond); + return static_cast(m_ticks) / static_cast(ticksPerMillisecond); } /*! @@ -179,7 +180,7 @@ constexpr inline double TimeSpan::totalMilliseconds() const */ constexpr inline double TimeSpan::totalSeconds() const { - return static_cast(m_ticks) / static_cast(m_ticksPerSecond); + return static_cast(m_ticks) / static_cast(ticksPerSecond); } /*! @@ -187,7 +188,7 @@ constexpr inline double TimeSpan::totalSeconds() const */ constexpr inline double TimeSpan::totalMinutes() const { - return static_cast(m_ticks) / static_cast(m_ticksPerMinute); + return static_cast(m_ticks) / static_cast(ticksPerMinute); } /*! @@ -195,7 +196,7 @@ constexpr inline double TimeSpan::totalMinutes() const */ constexpr inline double TimeSpan::totalHours() const { - return static_cast(m_ticks) / static_cast(m_ticksPerHour); + return static_cast(m_ticks) / static_cast(ticksPerHour); } /*! @@ -203,7 +204,7 @@ constexpr inline double TimeSpan::totalHours() const */ constexpr inline double TimeSpan::totalDays() const { - return static_cast(m_ticks) / static_cast(m_ticksPerDay); + return static_cast(m_ticks) / static_cast(ticksPerDay); } /*! @@ -211,7 +212,7 @@ constexpr inline double TimeSpan::totalDays() const */ constexpr inline int TimeSpan::milliseconds() const { - return (m_ticks / m_ticksPerMillisecond) % 1000l; + return (m_ticks / ticksPerMillisecond) % 1000l; } /*! @@ -219,7 +220,7 @@ constexpr inline int TimeSpan::milliseconds() const */ constexpr inline int TimeSpan::seconds() const { - return (m_ticks / m_ticksPerSecond) % 60l; + return (m_ticks / ticksPerSecond) % 60l; } /*! @@ -227,7 +228,7 @@ constexpr inline int TimeSpan::seconds() const */ constexpr inline int TimeSpan::minutes() const { - return (m_ticks / m_ticksPerMinute) % 60l; + return (m_ticks / ticksPerMinute) % 60l; } /*! @@ -235,7 +236,7 @@ constexpr inline int TimeSpan::minutes() const */ constexpr inline int TimeSpan::hours() const { - return (m_ticks / m_ticksPerHour) % 24l; + return (m_ticks / ticksPerHour) % 24l; } /*! @@ -243,7 +244,7 @@ constexpr inline int TimeSpan::hours() const */ constexpr inline int TimeSpan::days() const { - return (m_ticks / m_ticksPerDay); + return (m_ticks / ticksPerDay); } /*!