mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
Fix the string constructor to apply the timezone correctly.
This commit is contained in:
parent
ac515d6ce2
commit
bcedeff3ba
@ -43,7 +43,7 @@ using time64 = int64_t;
|
|||||||
static const TimeZoneProvider tzp;
|
static const TimeZoneProvider tzp;
|
||||||
// For converting to/from POSIX time.
|
// For converting to/from POSIX time.
|
||||||
static const PTime unix_epoch (Date(1970, boost::gregorian::Jan, 1),
|
static const PTime unix_epoch (Date(1970, boost::gregorian::Jan, 1),
|
||||||
boost::posix_time::seconds(0));
|
boost::posix_time::seconds(0));
|
||||||
static const TZ_Ptr utc_zone(new boost::local_time::posix_time_zone("UTC-0"));
|
static const TZ_Ptr utc_zone(new boost::local_time::posix_time_zone("UTC-0"));
|
||||||
|
|
||||||
/* To ensure things aren't overly screwed up by setting the nanosecond clock for boost::date_time. Don't do it, though, it doesn't get us anything and slows down the date/time library. */
|
/* To ensure things aren't overly screwed up by setting the nanosecond clock for boost::date_time. Don't do it, though, it doesn't get us anything and slows down the date/time library. */
|
||||||
@ -60,7 +60,7 @@ class GncDateImpl
|
|||||||
public:
|
public:
|
||||||
GncDateImpl(): m_greg(unix_epoch.date()) {}
|
GncDateImpl(): m_greg(unix_epoch.date()) {}
|
||||||
GncDateImpl(const int year, const int month, const int day) :
|
GncDateImpl(const int year, const int month, const int day) :
|
||||||
m_greg(year, static_cast<Month>(month), day) {}
|
m_greg(year, static_cast<Month>(month), day) {}
|
||||||
GncDateImpl(Date d) : m_greg(d) {}
|
GncDateImpl(Date d) : m_greg(d) {}
|
||||||
|
|
||||||
void today() { m_greg = boost::gregorian::day_clock::local_day(); }
|
void today() { m_greg = boost::gregorian::day_clock::local_day(); }
|
||||||
@ -83,15 +83,15 @@ LDT_from_unix_local(const time64 time)
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
PTime temp(unix_epoch.date(),
|
PTime temp(unix_epoch.date(),
|
||||||
boost::posix_time::hours(time / 3600) +
|
boost::posix_time::hours(time / 3600) +
|
||||||
boost::posix_time::seconds(time % 3600));
|
boost::posix_time::seconds(time % 3600));
|
||||||
auto tz = tzp.get(temp.date().year());
|
auto tz = tzp.get(temp.date().year());
|
||||||
return LDT(temp, tz);
|
return LDT(temp, tz);
|
||||||
}
|
}
|
||||||
catch(boost::gregorian::bad_year)
|
catch(boost::gregorian::bad_year)
|
||||||
{
|
{
|
||||||
throw(std::invalid_argument("Time value is outside the supported year range."));
|
throw(std::invalid_argument("Time value is outside the supported year range."));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -100,15 +100,15 @@ LDT_from_struct_tm(const struct tm tm)
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
auto tdate = boost::gregorian::date_from_tm(tm);
|
auto tdate = boost::gregorian::date_from_tm(tm);
|
||||||
auto tdur = boost::posix_time::time_duration(tm.tm_hour, tm.tm_min,
|
auto tdur = boost::posix_time::time_duration(tm.tm_hour, tm.tm_min,
|
||||||
tm.tm_sec, 0);
|
tm.tm_sec, 0);
|
||||||
auto tz = tzp.get(tdate.year());
|
auto tz = tzp.get(tdate.year());
|
||||||
return LDT(PTime(tdate, tdur), tz);
|
return LDT(PTime(tdate, tdur), tz);
|
||||||
}
|
}
|
||||||
catch(boost::gregorian::bad_year)
|
catch(boost::gregorian::bad_year)
|
||||||
{
|
{
|
||||||
throw(std::invalid_argument("Time value is outside the supported year range."));
|
throw(std::invalid_argument("Time value is outside the supported year range."));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -144,21 +144,28 @@ GncDateTimeImpl::GncDateTimeImpl(const std::string str) :
|
|||||||
auto tzpos = str.find_first_of("+-", str.find(":"));
|
auto tzpos = str.find_first_of("+-", str.find(":"));
|
||||||
if (tzpos != str.npos)
|
if (tzpos != str.npos)
|
||||||
{
|
{
|
||||||
string tzstr = "XXX" + str.substr(tzpos);
|
string tzstr = "XXX" + str.substr(tzpos);
|
||||||
if (tzstr.length() > 6 && tzstr[6] != ':') //6 for XXXsHH, s is + or -
|
if (tzstr.length() > 6 && tzstr[6] != ':') //6 for XXXsHH, s is + or -
|
||||||
tzstr.insert(6, ":");
|
tzstr.insert(6, ":");
|
||||||
if (tzstr.length() > 9 && tzstr[9] != ':') //9 for XXXsHH:MM
|
if (tzstr.length() > 9 && tzstr[9] != ':') //9 for XXXsHH:MM
|
||||||
tzstr.insert(9, ":");
|
tzstr.insert(9, ":");
|
||||||
tzptr.reset(new PTZ(tzstr));
|
tzptr.reset(new PTZ(tzstr));
|
||||||
if (str[tzpos - 1] == ' ') --tzpos;
|
if (str[tzpos - 1] == ' ') --tzpos;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tzptr = utc_zone;
|
tzptr = utc_zone;
|
||||||
|
}
|
||||||
|
try
|
||||||
|
{
|
||||||
|
auto pdt = boost::posix_time::time_from_string(str.substr(0, tzpos));
|
||||||
|
m_time = LDT(pdt.date(), pdt.time_of_day(), tzptr,
|
||||||
|
LDTBase::NOT_DATE_TIME_ON_ERROR);
|
||||||
|
}
|
||||||
|
catch(boost::gregorian::bad_year)
|
||||||
|
{
|
||||||
|
throw(std::invalid_argument("The date string was outside of the supported year range."));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto pdt = boost::posix_time::time_from_string(str.substr(0, tzpos));
|
|
||||||
m_time = LDT(pdt, tzptr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GncDateTimeImpl::operator time64() const
|
GncDateTimeImpl::operator time64() const
|
||||||
|
Loading…
Reference in New Issue
Block a user