Browse Source

parsing promos

moroznastya 1 year ago
parent
commit
faf9f5de6a

+ 6 - 2
library/cpp/timezone_conversion/civil.cpp

@@ -25,6 +25,12 @@ namespace {
         if (!name.SkipPrefix(OFFSET_PREFIX)) {
             return false;
         }
+        return NDatetime::TryParseOffset(name, offset);
+    }
+} // anonymous namespace
+
+namespace NDatetime {
+    bool TryParseOffset(TStringBuf name, int& offset) {
         if (name.empty()) {
             return false;
         }
@@ -61,9 +67,7 @@ namespace {
             offset = -offset;
         return true;
     }
-} // anonymous namespace
 
-namespace NDatetime {
     TTimeZone GetTimeZone(TStringBuf name) {
         int offset;
         if (TryParseUTCOffsetTimezone(name, offset)) {

+ 11 - 2
library/cpp/timezone_conversion/civil.h

@@ -100,6 +100,15 @@ namespace NDatetime {
      */
     TTimeZone GetTimeZone(TStringBuf name);
 
+    /**
+     *Helper for get timezone offset from timezone string
+     * Examples:
+     * "+01:30" -> 5400
+     * "-10" -> -36000
+     * "-0200" -> -7200
+     */
+    bool TryParseOffset(TStringBuf name, int& offset);
+
     /**
      * Returns a time zone that is a fixed offset (seconds east) from UTC.
      * Note: If the absolute value of the offset is greater than 24 hours
@@ -108,7 +117,7 @@ namespace NDatetime {
     TTimeZone GetFixedTimeZone(const long offset);
 
     /** Convert civil time from one timezone to another
-     * @param[in] src is source time with 'from' timezone 
+     * @param[in] src is source time with 'from' timezone
      * @param[in] from is a initial timezone
      * @param[in] from is a destination timezone
      * @return a civil time
@@ -323,7 +332,7 @@ namespace NDatetime {
      * 02      6  7  8  9 10 11...
      *
      * In case if you received zero value, you may call function again with usePreviousYear=true
-     * Also you may use usePreviousYear to calculate week difference between two dates in different year 
+     * Also you may use usePreviousYear to calculate week difference between two dates in different year
      */
      CONSTEXPR_M int GetYearWeek(const TCivilDay& cd, bool usePreviousYear = false) noexcept {
          const auto jan1 = NDatetime::GetWeekday(NDatetime::TCivilDay{cd.year() - (usePreviousYear ? 1 : 0), 1, 1});

+ 21 - 0
library/cpp/timezone_conversion/ut/civil_ut.cpp

@@ -66,6 +66,27 @@ Y_UNIT_TEST_SUITE(DateTime) {
         UNIT_ASSERT_EXCEPTION(NDatetime::GetTimeZone("UTC+20:60"), NDatetime::TInvalidTimezone);
         UNIT_ASSERT_EXCEPTION(NDatetime::GetTimeZone("UTC+20:30:"), NDatetime::TInvalidTimezone);
     }
+    Y_UNIT_TEST(ParseOffset) {
+        int offset;
+        UNIT_ASSERT(!NDatetime::TryParseOffset("Unknown", offset));
+        UNIT_ASSERT(!NDatetime::TryParseOffset("+:", offset));
+        UNIT_ASSERT(!NDatetime::TryParseOffset("+24:01", offset));
+        UNIT_ASSERT(!NDatetime::TryParseOffset("+20:", offset));
+        UNIT_ASSERT(!NDatetime::TryParseOffset("+20:60", offset));
+        UNIT_ASSERT(!NDatetime::TryParseOffset("+20:30:", offset));
+        UNIT_ASSERT(NDatetime::TryParseOffset("+03", offset));
+        UNIT_ASSERT_VALUES_EQUAL(offset, 10800);
+        UNIT_ASSERT(NDatetime::TryParseOffset("-10", offset));
+        UNIT_ASSERT_VALUES_EQUAL(offset, -36000);
+        UNIT_ASSERT(NDatetime::TryParseOffset("+01:00", offset));
+        UNIT_ASSERT_VALUES_EQUAL(offset, 3600);
+        UNIT_ASSERT(NDatetime::TryParseOffset("-11:30", offset));
+        UNIT_ASSERT_VALUES_EQUAL(offset, -41400);
+        UNIT_ASSERT(NDatetime::TryParseOffset("+0130", offset));
+        UNIT_ASSERT_VALUES_EQUAL(offset, 5400);
+        UNIT_ASSERT(NDatetime::TryParseOffset("-0200", offset));
+        UNIT_ASSERT_VALUES_EQUAL(offset, -7200);
+    }
     Y_UNIT_TEST(Format) {
         NDatetime::TTimeZone lax = NDatetime::GetTimeZone("America/Los_Angeles");
         NDatetime::TCivilSecond tp(2013, 1, 2, 3, 4, 5);