forked from HowardHinnant/date
Implement '%z'
This commit is contained in:
85
tz.cpp
85
tz.cpp
@@ -1637,6 +1637,66 @@ Zone::adjust_infos(const std::vector<Rule>& rules)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
std::string
|
||||||
|
format_abbrev(std::string format, const std::string& variable, std::chrono::seconds off,
|
||||||
|
std::chrono::minutes save)
|
||||||
|
{
|
||||||
|
using namespace std::chrono;
|
||||||
|
auto k = format.find("%s");
|
||||||
|
if (k != std::string::npos)
|
||||||
|
{
|
||||||
|
format.replace(k, 2, variable);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
k = format.find('/');
|
||||||
|
if (k != std::string::npos)
|
||||||
|
{
|
||||||
|
if (save == minutes{0})
|
||||||
|
format.erase(k);
|
||||||
|
else
|
||||||
|
format.erase(0, k+1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
k = format.find("%z");
|
||||||
|
if (k != std::string::npos)
|
||||||
|
{
|
||||||
|
std::string temp;
|
||||||
|
if (off < seconds{0})
|
||||||
|
{
|
||||||
|
temp = '-';
|
||||||
|
off = -off;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
temp = '+';
|
||||||
|
auto h = floor<hours>(off);
|
||||||
|
off -= h;
|
||||||
|
if (h < hours{10})
|
||||||
|
temp += '0';
|
||||||
|
temp += std::to_string(h.count());
|
||||||
|
if (off > seconds{0})
|
||||||
|
{
|
||||||
|
auto m = floor<minutes>(off);
|
||||||
|
off -= m;
|
||||||
|
if (m < minutes{10})
|
||||||
|
temp += '0';
|
||||||
|
temp += std::to_string(m.count());
|
||||||
|
if (off > seconds{0})
|
||||||
|
{
|
||||||
|
if (off < seconds{10})
|
||||||
|
temp += '0';
|
||||||
|
temp += std::to_string(off.count());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
format.replace(k, 2, temp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return format;
|
||||||
|
}
|
||||||
|
|
||||||
Info
|
Info
|
||||||
Zone::get_info(std::chrono::system_clock::time_point tp, tz timezone) const
|
Zone::get_info(std::chrono::system_clock::time_point tp, tz timezone) const
|
||||||
{
|
{
|
||||||
@@ -1667,7 +1727,6 @@ Zone::get_info(std::chrono::system_clock::time_point tp, tz timezone) const
|
|||||||
r.end = i->until_utc_;
|
r.end = i->until_utc_;
|
||||||
r.offset = i->gmtoff_ + i->u.save_;
|
r.offset = i->gmtoff_ + i->u.save_;
|
||||||
r.save = i->u.save_;
|
r.save = i->u.save_;
|
||||||
r.abbrev = i->format_;
|
|
||||||
}
|
}
|
||||||
else if (i->u.rule_.empty())
|
else if (i->u.rule_.empty())
|
||||||
{
|
{
|
||||||
@@ -1677,41 +1736,19 @@ Zone::get_info(std::chrono::system_clock::time_point tp, tz timezone) const
|
|||||||
r.begin = day_point(year::min()/boring_day);
|
r.begin = day_point(year::min()/boring_day);
|
||||||
r.end = i->until_utc_;
|
r.end = i->until_utc_;
|
||||||
r.offset = i->gmtoff_;
|
r.offset = i->gmtoff_;
|
||||||
r.abbrev = i->format_;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
r = find_rule(i->first_rule_, i->last_rule_, y, i->gmtoff_,
|
r = find_rule(i->first_rule_, i->last_rule_, y, i->gmtoff_,
|
||||||
MonthDayTime(tps, timezone), i->initial_save_,
|
MonthDayTime(tps, timezone), i->initial_save_,
|
||||||
i->initial_abbrev_);
|
i->initial_abbrev_);
|
||||||
auto k = i->format_.find("%s");
|
|
||||||
if (k != std::string::npos)
|
|
||||||
{
|
|
||||||
std::string abbrev = r.abbrev;
|
|
||||||
r.abbrev = i->format_;
|
|
||||||
r.abbrev.replace(k, 2, abbrev);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
k = i->format_.find('/');
|
|
||||||
if (k != std::string::npos)
|
|
||||||
{
|
|
||||||
if (r.save == seconds{0})
|
|
||||||
r.abbrev = i->format_.substr(0, k);
|
|
||||||
else
|
|
||||||
r.abbrev = i->format_.substr(k+1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
r.abbrev = i->format_;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
r.offset = i->gmtoff_ + r.save;
|
r.offset = i->gmtoff_ + r.save;
|
||||||
if (i != zonelets_.begin() && r.begin < i[-1].until_utc_)
|
if (i != zonelets_.begin() && r.begin < i[-1].until_utc_)
|
||||||
r.begin = i[-1].until_utc_;
|
r.begin = i[-1].until_utc_;
|
||||||
if (r.end > i->until_utc_)
|
if (r.end > i->until_utc_)
|
||||||
r.end = i->until_utc_;
|
r.end = i->until_utc_;
|
||||||
}
|
}
|
||||||
|
r.abbrev = format_abbrev(i->format_, r.abbrev, r.offset, r.save);
|
||||||
assert(r.begin < r.end);
|
assert(r.begin < r.end);
|
||||||
}
|
}
|
||||||
return r;
|
return r;
|
||||||
|
Reference in New Issue
Block a user