Browse Source

Make "GMT+03:00" known timezone format
cd2e9b766cd6579b0124ffe05b23a22513e19a93

d-dima 1 year ago
parent
commit
e98c636d75
1 changed files with 14 additions and 5 deletions
  1. 14 5
      library/cpp/timezone_conversion/civil.cpp

+ 14 - 5
library/cpp/timezone_conversion/civil.cpp

@@ -20,10 +20,15 @@ namespace {
         return true;
     }
 
-    bool TryParseUTCOffsetTimezone(TStringBuf name, int& offset) {
-        static constexpr TStringBuf OFFSET_PREFIX = "UTC";
-        if (!name.SkipPrefix(OFFSET_PREFIX)) {
-            return false;
+    bool TryParseUTCGMTOffsetTimezone(TStringBuf name, int& offset) {
+        static constexpr TStringBuf OFFSET_PREFIX_UTC = "UTC";
+        static constexpr TStringBuf OFFSET_PREFIX_GMT = "GMT";
+        if (!name.SkipPrefix(OFFSET_PREFIX_UTC)) {
+            // Sometimes timezones from client devices look like 'GMT+03:00'
+            // This format is not standard but can be translated like UTC+xxx
+            if (!name.SkipPrefix(OFFSET_PREFIX_GMT)) {
+                return false;
+            }
         }
         return NDatetime::TryParseOffset(name, offset);
     }
@@ -70,7 +75,11 @@ namespace NDatetime {
 
     TTimeZone GetTimeZone(TStringBuf name) {
         int offset;
-        if (TryParseUTCOffsetTimezone(name, offset)) {
+        // Try to preparse constant timezones like:
+        // UTC+03:00
+        // GMT+03:00
+        // Note constant timezones like 'Etc-03' will be handed in cctz library
+        if (TryParseUTCGMTOffsetTimezone(name, offset)) {
             return GetFixedTimeZone(offset);
         }
         TTimeZone result;