mirror of
https://github.com/fmtlib/fmt.git
synced 2024-10-02 13:02:03 +00:00
Extract timezone offset from timezone conversion functions
Signed-off-by: Vladislav Shchapov <vladislav@shchapov.ru>
This commit is contained in:
parent
1bf302a4ea
commit
c06e0b4ede
@ -427,33 +427,14 @@ inline void do_write(buffer<Char>& buf, const std::tm& time,
|
|||||||
os.imbue(loc);
|
os.imbue(loc);
|
||||||
using iterator = std::ostreambuf_iterator<Char>;
|
using iterator = std::ostreambuf_iterator<Char>;
|
||||||
const auto& facet = std::use_facet<std::time_put<Char, iterator>>(loc);
|
const auto& facet = std::use_facet<std::time_put<Char, iterator>>(loc);
|
||||||
// std::time_put may not support '%Ez', '%Oz'.
|
|
||||||
bool modified_z = false;
|
|
||||||
if (format == 'z' && modifier != '\0') {
|
|
||||||
modified_z = true;
|
|
||||||
modifier = '\0';
|
|
||||||
}
|
|
||||||
auto end = facet.put(os, os, Char(' '), &time, format, modifier);
|
auto end = facet.put(os, os, Char(' '), &time, format, modifier);
|
||||||
if (end.failed()) FMT_THROW(format_error("failed to format time"));
|
if (end.failed()) FMT_THROW(format_error("failed to format time"));
|
||||||
if (modified_z) {
|
|
||||||
// Insert ':' into ISO 8601 formatted timezone
|
|
||||||
auto size = buf.size();
|
|
||||||
buf.push_back(*(buf.end() - 1));
|
|
||||||
Char* p = buf.data();
|
|
||||||
p[size - 1] = p[size - 2];
|
|
||||||
p[size - 2] = Char(':');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Char, typename OutputIt,
|
template <typename Char, typename OutputIt,
|
||||||
FMT_ENABLE_IF(!std::is_same<Char, char>::value)>
|
FMT_ENABLE_IF(!std::is_same<Char, char>::value)>
|
||||||
auto write(OutputIt out, const std::tm& time, const std::locale& loc,
|
auto write(OutputIt out, const std::tm& time, const std::locale& loc,
|
||||||
char format, char modifier = 0) -> OutputIt {
|
char format, char modifier = 0) -> OutputIt {
|
||||||
if (format == 'z' && modifier != '\0') {
|
|
||||||
auto&& buf = basic_memory_buffer<Char>();
|
|
||||||
do_write<Char>(buf, time, loc, format, modifier);
|
|
||||||
return copy_str<Char>(buf.begin(), buf.end(), out);
|
|
||||||
}
|
|
||||||
auto&& buf = get_buffer<Char>(out);
|
auto&& buf = get_buffer<Char>(out);
|
||||||
do_write<Char>(buf, time, loc, format, modifier);
|
do_write<Char>(buf, time, loc, format, modifier);
|
||||||
return get_iterator(buf, out);
|
return get_iterator(buf, out);
|
||||||
@ -1274,8 +1255,15 @@ class tm_writer {
|
|||||||
}
|
}
|
||||||
write_utc_offset(-offset, ns);
|
write_utc_offset(-offset, ns);
|
||||||
#else
|
#else
|
||||||
ignore_unused(tm);
|
if (ns == numeric_system::standard) return format_localized('z');
|
||||||
format_localized('z', ns == numeric_system::standard ? '\0' : 'E');
|
|
||||||
|
// Extract timezone offset from timezone conversion functions.
|
||||||
|
std::tm gtm = tm;
|
||||||
|
std::time_t gt = std::mktime(>m);
|
||||||
|
std::tm ltm = gmtime(gt);
|
||||||
|
std::time_t lt = std::mktime(<m);
|
||||||
|
long offset = gt - lt;
|
||||||
|
write_utc_offset(offset, ns);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user