Add DateTime::fromIsoString{Gmt,Local}
This commit is contained in:
parent
a43e9b2baf
commit
31be0c24ea
|
@ -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;
|
||||
|
|
|
@ -63,6 +63,8 @@ public:
|
|||
static DateTime fromString(const std::string &str);
|
||||
static DateTime fromString(const char *str);
|
||||
static std::pair<DateTime, TimeSpan> 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<DayOfWeek>((m_ticks / TimeSpan::m_ticksPerDay) % 7l);
|
||||
return static_cast<DayOfWeek>((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);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
|
|
@ -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<int64>(milliseconds * static_cast<double>(m_ticksPerMillisecond)));
|
||||
return TimeSpan(static_cast<int64>(milliseconds * static_cast<double>(ticksPerMillisecond)));
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -107,7 +108,7 @@ constexpr inline TimeSpan TimeSpan::fromMilliseconds(double milliseconds)
|
|||
*/
|
||||
constexpr inline TimeSpan TimeSpan::fromSeconds(double seconds)
|
||||
{
|
||||
return TimeSpan(static_cast<int64>(seconds * static_cast<double>(m_ticksPerSecond)));
|
||||
return TimeSpan(static_cast<int64>(seconds * static_cast<double>(ticksPerSecond)));
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -115,7 +116,7 @@ constexpr inline TimeSpan TimeSpan::fromSeconds(double seconds)
|
|||
*/
|
||||
constexpr inline TimeSpan TimeSpan::fromMinutes(double minutes)
|
||||
{
|
||||
return TimeSpan(static_cast<int64>(minutes * static_cast<double>(m_ticksPerMinute)));
|
||||
return TimeSpan(static_cast<int64>(minutes * static_cast<double>(ticksPerMinute)));
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -123,7 +124,7 @@ constexpr inline TimeSpan TimeSpan::fromMinutes(double minutes)
|
|||
*/
|
||||
constexpr inline TimeSpan TimeSpan::fromHours(double hours)
|
||||
{
|
||||
return TimeSpan(static_cast<int64>(hours * static_cast<double>(m_ticksPerHour)));
|
||||
return TimeSpan(static_cast<int64>(hours * static_cast<double>(ticksPerHour)));
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -131,7 +132,7 @@ constexpr inline TimeSpan TimeSpan::fromHours(double hours)
|
|||
*/
|
||||
constexpr inline TimeSpan TimeSpan::fromDays(double days)
|
||||
{
|
||||
return TimeSpan(static_cast<int64>(days * static_cast<double>(m_ticksPerDay)));
|
||||
return TimeSpan(static_cast<int64>(days * static_cast<double>(ticksPerDay)));
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -171,7 +172,7 @@ constexpr inline int64 TimeSpan::totalTicks() const
|
|||
*/
|
||||
constexpr inline double TimeSpan::totalMilliseconds() const
|
||||
{
|
||||
return static_cast<double>(m_ticks) / static_cast<double>(m_ticksPerMillisecond);
|
||||
return static_cast<double>(m_ticks) / static_cast<double>(ticksPerMillisecond);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -179,7 +180,7 @@ constexpr inline double TimeSpan::totalMilliseconds() const
|
|||
*/
|
||||
constexpr inline double TimeSpan::totalSeconds() const
|
||||
{
|
||||
return static_cast<double>(m_ticks) / static_cast<double>(m_ticksPerSecond);
|
||||
return static_cast<double>(m_ticks) / static_cast<double>(ticksPerSecond);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -187,7 +188,7 @@ constexpr inline double TimeSpan::totalSeconds() const
|
|||
*/
|
||||
constexpr inline double TimeSpan::totalMinutes() const
|
||||
{
|
||||
return static_cast<double>(m_ticks) / static_cast<double>(m_ticksPerMinute);
|
||||
return static_cast<double>(m_ticks) / static_cast<double>(ticksPerMinute);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -195,7 +196,7 @@ constexpr inline double TimeSpan::totalMinutes() const
|
|||
*/
|
||||
constexpr inline double TimeSpan::totalHours() const
|
||||
{
|
||||
return static_cast<double>(m_ticks) / static_cast<double>(m_ticksPerHour);
|
||||
return static_cast<double>(m_ticks) / static_cast<double>(ticksPerHour);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -203,7 +204,7 @@ constexpr inline double TimeSpan::totalHours() const
|
|||
*/
|
||||
constexpr inline double TimeSpan::totalDays() const
|
||||
{
|
||||
return static_cast<double>(m_ticks) / static_cast<double>(m_ticksPerDay);
|
||||
return static_cast<double>(m_ticks) / static_cast<double>(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);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
|
Loading…
Reference in New Issue