diff options
author | James Cook <james@lindenlab.com> | 2007-01-02 08:33:20 +0000 |
---|---|---|
committer | James Cook <james@lindenlab.com> | 2007-01-02 08:33:20 +0000 |
commit | 420b91db29485df39fd6e724e782c449158811cb (patch) | |
tree | b471a94563af914d3ed3edd3e856d21cb1b69945 /indra/llcommon/lldate.cpp |
Print done when done.
Diffstat (limited to 'indra/llcommon/lldate.cpp')
-rw-r--r-- | indra/llcommon/lldate.cpp | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/indra/llcommon/lldate.cpp b/indra/llcommon/lldate.cpp new file mode 100644 index 0000000000..6ae2a1145f --- /dev/null +++ b/indra/llcommon/lldate.cpp @@ -0,0 +1,174 @@ +/** + * @file lldate.cpp + * @author Phoenix + * @date 2006-02-05 + * @brief Implementation of the date class + * + * Copyright (c) 2006-$CurrentYear$, Linden Research, Inc. + * $License$ + */ + +#include "linden_common.h" +#include "lldate.h" + +#include "apr-1/apr_time.h" + +#include <iomanip> +#include <sstream> + +static const F64 DATE_EPOCH = 0.0; + +static const F64 LL_APR_USEC_PER_SEC = 1000000.0; + // should be APR_USEC_PER_SEC, but that relies on INT64_C which + // isn't defined in glib under our build set up for some reason + + +LLDate::LLDate() : mSecondsSinceEpoch(DATE_EPOCH) +{ +} + +LLDate::LLDate(const LLDate& date) : + mSecondsSinceEpoch(date.mSecondsSinceEpoch) +{ +} + +LLDate::LLDate(F64 seconds_since_epoch) : + mSecondsSinceEpoch(seconds_since_epoch) +{ +} + +LLDate::LLDate(const std::string& iso8601_date) +{ + if(!fromString(iso8601_date)) + { + mSecondsSinceEpoch = DATE_EPOCH; + } +} + +std::string LLDate::asString() const +{ + std::ostringstream stream; + toStream(stream); + return stream.str(); +} + +void LLDate::toStream(std::ostream& s) const +{ + apr_time_t time = (apr_time_t)(mSecondsSinceEpoch * LL_APR_USEC_PER_SEC); + + apr_time_exp_t exp_time; + if (apr_time_exp_gmt(&exp_time, time) != APR_SUCCESS) + { + s << "1970-01-01T00:00:00Z"; + return; + } + + s << std::dec << std::setfill('0'); +#if( LL_WINDOWS || __GNUC__ > 2) + s << std::right; +#else + s.setf(ios::right); +#endif + s << std::setw(4) << (exp_time.tm_year + 1900) + << '-' << std::setw(2) << (exp_time.tm_mon + 1) + << '-' << std::setw(2) << (exp_time.tm_mday) + << 'T' << std::setw(2) << (exp_time.tm_hour) + << ':' << std::setw(2) << (exp_time.tm_min) + << ':' << std::setw(2) << (exp_time.tm_sec); + if (exp_time.tm_usec > 0) + { + s << '.' << std::setw(2) + << (int)(exp_time.tm_usec / (LL_APR_USEC_PER_SEC / 100)); + } + s << 'Z'; +} + +bool LLDate::fromString(const std::string& iso8601_date) +{ + std::istringstream stream(iso8601_date); + return fromStream(stream); +} + +bool LLDate::fromStream(std::istream& s) +{ + struct apr_time_exp_t exp_time; + apr_int32_t tm_part; + int c; + + s >> tm_part; + exp_time.tm_year = tm_part - 1900; + c = s.get(); // skip the hypen + if (c != '-') { return false; } + s >> tm_part; + exp_time.tm_mon = tm_part - 1; + c = s.get(); // skip the hypen + if (c != '-') { return false; } + s >> tm_part; + exp_time.tm_mday = tm_part; + + c = s.get(); // skip the T + if (c != 'T') { return false; } + + s >> tm_part; + exp_time.tm_hour = tm_part; + c = s.get(); // skip the : + if (c != ':') { return false; } + s >> tm_part; + exp_time.tm_min = tm_part; + c = s.get(); // skip the : + if (c != ':') { return false; } + s >> tm_part; + exp_time.tm_sec = tm_part; + + // zero out the unused fields + exp_time.tm_usec = 0; + exp_time.tm_wday = 0; + exp_time.tm_yday = 0; + exp_time.tm_isdst = 0; + exp_time.tm_gmtoff = 0; + + // generate a time_t from that + apr_time_t time; + if (apr_time_exp_gmt_get(&time, &exp_time) != APR_SUCCESS) + { + return false; + } + + F64 seconds_since_epoch = time / LL_APR_USEC_PER_SEC; + + // check for fractional + c = s.peek(); + if(c == '.') + { + F64 fractional = 0.0; + s >> fractional; + seconds_since_epoch += fractional; + } + s.get(); // skip the Z + if (c != 'Z') { return false; } + + mSecondsSinceEpoch = seconds_since_epoch; + return true; +} + +F64 LLDate::secondsSinceEpoch() const +{ + return mSecondsSinceEpoch; +} + +void LLDate::secondsSinceEpoch(F64 seconds) +{ + mSecondsSinceEpoch = seconds; +} + +std::ostream& operator<<(std::ostream& s, const LLDate& date) +{ + date.toStream(s); + return s; +} + +std::istream& operator>>(std::istream& s, LLDate& date) +{ + date.fromStream(s); + return s; +} |