From 2e07459336c7a86e43780d5b84a5405c8a7970c2 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Wed, 1 Mar 2023 16:55:50 +0100 Subject: [PATCH] Preparations for australian daylight saving time --- src/espchrono.cpp | 19 +++++++++++++++---- src/espchrono.h | 3 ++- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/espchrono.cpp b/src/espchrono.cpp index d73a031..a4fa0eb 100644 --- a/src/espchrono.cpp +++ b/src/espchrono.cpp @@ -11,7 +11,7 @@ namespace espchrono { namespace { static const uint8_t _monthDays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; -bool summerTime(local_clock::time_point timeStamp) +bool isEuropeanSummerTime(local_clock::time_point timeStamp) { LocalDateTime _tempDateTime = toDateTime(timeStamp); @@ -22,7 +22,7 @@ bool summerTime(local_clock::time_point timeStamp) (_tempDateTime.date.month() == October && (_tempDateTime.hour + 24 * unsigned(_tempDateTime.date.day())) < (2 + 24 * (31 - (5 * int(_tempDateTime.date.year()) / 4 + 1) % 7))); } -bool daylightSavingTime(local_clock::time_point _timeStamp) +bool isUsDaylightTime(local_clock::time_point _timeStamp) { LocalDateTime _tempDateTime = toDateTime(_timeStamp); @@ -71,6 +71,16 @@ bool daylightSavingTime(local_clock::time_point _timeStamp) return _tempDateTime.date.day() < 8_d && _tempDateTime.dayOfWeek == 1 && _tempDateTime.hour < 2; } // end else } + +bool isAustralianDaylightTime(local_clock::time_point timeStamp) +{ + LocalDateTime dateTime = toDateTime(timeStamp); + + const date::sys_days startOfDst = dateTime.date.year()/October/Sunday[0]; + const date::sys_days endOfDst = dateTime.date.year()/April/Sunday[0]; + + return dateTime.date < endOfDst || dateTime.date > startOfDst; +} } // namespace #if !defined(ESP32) || defined(CONFIG_ESPCHRONO_SUPPORT_DEFAULT_TIMEZONE) @@ -87,8 +97,9 @@ local_clock::time_point utcToLocal(utc_clock::time_point utc, time_zone timezone switch (timezone.dayLightSavingMode) { case DayLightSavingMode::None: break; - case DayLightSavingMode::EuropeanSummerTime: if (summerTime(local)) local.dst = true; break; - case DayLightSavingMode::UsDaylightTime: if (daylightSavingTime(local)) local.dst = true; break; + case DayLightSavingMode::EuropeanSummerTime: if (isEuropeanSummerTime(local)) local.dst = true; break; + case DayLightSavingMode::UsDaylightTime: if (isUsDaylightTime(local)) local.dst = true; break; + case DayLightSavingMode::AustralianDaylightTime: if (isAustralianDaylightTime(local)) local.dst = true; break; } if (local.dst) diff --git a/src/espchrono.h b/src/espchrono.h index 17d7624..89bf019 100644 --- a/src/espchrono.h +++ b/src/espchrono.h @@ -54,7 +54,8 @@ struct utc_clock #define DayLightSavingModeValues(x) \ x(None) \ x(EuropeanSummerTime) \ - x(UsDaylightTime) + x(UsDaylightTime) \ + x(AustralianDaylightTime) DECLARE_TYPESAFE_ENUM(DayLightSavingMode, : uint8_t, DayLightSavingModeValues) struct time_zone