23#include <boost/locale/date_time_facet.hpp>
26#include <unordered_map>
30std::unordered_map<uint32, Minutes, std::identity> InitTimezoneHashDb()
32#if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS
35 std::unordered_map<uint32, Minutes, std::identity> hashToOffset;
36 std::chrono::system_clock::time_point dummmy;
37 for (std::chrono::time_zone
const& zone : std::chrono::get_tzdb().zones)
39 std::chrono::sys_info sysInfo = zone.get_info(dummmy);
40 Minutes offsetMinutes = std::chrono::duration_cast<Minutes>(sysInfo.offset);
47 std::unordered_map<uint32, Minutes, std::identity> hashToOffset =
49 { 0xAADC2D37u, -720min },
50 { 0x362F107Bu, -690min },
51 { 0x2C44C70Cu, -660min },
52 { 0xB84A209Eu, -640min },
53 { 0xBA3D57D1u, -630min },
54 { 0x4040695Au, -600min },
55 { 0xB65A75D0u, -570min },
56 { 0xC8614DEBu, -540min },
57 { 0x3A68BD26u, -510min },
58 { 0x51E8096Cu, -480min },
59 { 0x4DD8F896u, -420min },
60 { 0x674B7C0Fu, -360min },
61 { 0x633C6B39u, -300min },
62 { 0x0BAD340Au, -240min },
63 { 0x74B25683u, -225min },
64 { 0x09B9FCD7u, -210min },
65 { 0x150C169Bu, -180min },
66 { 0x191B2771u, -120min },
67 { 0xD7D3B14Eu, -60min },
68 { 0x47CE5170u, -44min },
69 { 0x350CA8AFu, 0min },
70 { 0x15E8E23Bu, 60min },
71 { 0x733864AEu, 120min },
72 { 0xF71F9C94u, 180min },
73 { 0xBDE50F54u, 210min },
74 { 0x2BDD6DB9u, 240min },
75 { 0xB1E07F42u, 270min },
76 { 0x454FF132u, 300min },
77 { 0x3F4DA929u, 330min },
78 { 0xD1554AC4u, 360min },
79 { 0xBB667143u, 390min },
80 { 0x9E2B78C9u, 420min },
81 { 0x1C377816u, 450min },
82 { 0x1A4440E3u, 480min },
83 { 0xB49DF789u, 525min },
84 { 0xC3A28C54u, 540min },
85 { 0x35A9FB8Fu, 570min },
86 { 0x889BD751u, 600min },
87 { 0x8CAAE827u, 660min },
88 { 0x7285EE60u, 690min },
89 { 0x1CC2DEF4u, 720min },
90 { 0x89B8FD2Fu, 765min },
91 { 0x98DBA70Eu, 780min },
92 { 0xC59585BBu, 840min }
99std::unordered_map<uint32, Minutes, std::identity>
const& GetTimezoneOffsetsByHash()
101 static std::unordered_map<uint32, Minutes, std::identity> timezoneMap = InitTimezoneHashDb();
105using ClientSupportedTimezone = std::pair<Minutes, std::string>;
106std::array<ClientSupportedTimezone, 11>
const _clientSupportedTimezones =
108 { -480min,
"America/Los_Angeles" },
109 { -420min,
"America/Denver" },
110 { -360min,
"America/Chicago" },
111 { -300min,
"America/New_York" },
112 { -180min,
"America/Sao_Paulo" },
114 { 60min,
"Europe/Paris" },
115 { 480min,
"Asia/Shanghai" },
116 { 480min,
"Asia/Taipei" },
117 { 540min,
"Asia/Seoul" },
118 { 600min,
"Australia/Melbourne" },
135#if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS
136 offset = std::chrono::current_zone()->get_info(date).offset;
138 tm buf =
TimeBreakdown(std::chrono::system_clock::to_time_t(date));
139 offset =
Seconds(buf.tm_gmtoff);
141 return std::chrono::duration_cast<Minutes>(offset);
146 std::chrono::system_clock::time_point date = std::chrono::system_clock::from_time_t(std::time_t(0));
148 date = std::chrono::system_clock::now();
155#if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS
156 return std::string(std::chrono::current_zone()->name());
158 std::unique_ptr<boost::locale::abstract_calendar> p(std::use_facet<class boost::locale::calendar_facet>(
Locale::GetCalendarLocale()).create_calendar());
159 return p->get_timezone();
166 auto itr = std::find_if(_clientSupportedTimezones.begin(), _clientSupportedTimezones.end(), [currentTimezone](ClientSupportedTimezone
const& tz)
168 return tz.second == currentTimezone;
170 if (itr != _clientSupportedTimezones.end())
174 itr = std::min_element(_clientSupportedTimezones.begin(), _clientSupportedTimezones.end(), [currentTimezoneOffset](ClientSupportedTimezone
const& left, ClientSupportedTimezone
const& right)
176 Minutes leftDiff = left.first - currentTimezoneOffset;
177 Minutes rightDiff = right.first - currentTimezoneOffset;
178 return std::abs(leftDiff.count()) < std::abs(rightDiff.count());
std::chrono::system_clock::time_point SystemTimePoint
std::chrono::seconds Seconds
Seconds shorthand typedef.
std::chrono::minutes Minutes
Minutes shorthand typedef.
tm TimeBreakdown(time_t time)
auto MapGetValuePtr(M &map, typename M::key_type const &key)
TC_COMMON_API std::locale const & GetCalendarLocale()
Minutes GetOffsetByHash(uint32 hash)
std::string_view FindClosestClientSupportedTimezone(std::string_view currentTimezone, Minutes currentTimezoneOffset)
Minutes GetSystemZoneOffset(bool applyDst)
std::string GetSystemZoneName()
Minutes GetSystemZoneOffsetAt(SystemTimePoint date)
std::string ToString(Type &&val, Params &&... params)
constexpr std::uint32_t HashFnv1a(std::string_view data)