David Fox

Forum Replies Created

Viewing 1 post (of 1 total)
  • Author
    Posts
  • in reply to: Daylight savings time #52606

    David Fox
    Participant

    // This code is specific for Mountain Time Zone and other time zones that use the same dates.

    #include <Wire.h>
    #include “RTClib.h” // Library for DS3231 RTC module

    RTC_DS3231 rtc;

    void setup() {
    Serial.begin(9600);
    Wire.begin();
    rtc.begin();

    // If the RTC lost power and lost track of time, set the time to compile time
    if (!rtc.isrunning()) {
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    }
    }

    void loop() {
    DateTime now = rtc.now();
    adjustForDST(now);
    printTime(now);
    delay(1000); // Update once per second
    }

    void adjustForDST(DateTime &time) {
    int year = time.year();
    int month = time.month();
    int day = time.day();
    int hour = time.hour();

    // Adjust for DST if necessary
    if (isDST(year, month, day)) {
    hour++; // Add one hour for DST
    if (hour > 23) {
    hour = 0; // Wrap around to 0 if hour exceeds 23
    day++; // Move to the next day
    }
    }

    // Update the time object with adjusted values
    time = DateTime(year, month, day, hour, time.minute(), time.second());
    }

    bool isDST(int year, int month, int day) {
    // Check if the given date falls within DST period for Mountain Time Zone
    if (month < 3 || month > 11) return false; // January, February, and December are definitely not DST months
    if (month > 3 && month < 11) return true; // April to October are definitely DST months

    // Determine the exact transition dates for DST in Mountain Time Zone
    if (month == 3) {
    int previousSunday = day – (time.dayOfTheWeek() – 1);
    if (day >= 8 && previousSunday <= 14) { // Second Sunday
    return (day – previousSunday) >= 7;
    }
    }
    if (month == 11) {
    int previousSunday = day – (time.dayOfTheWeek() – 1);
    if (day <= 7 && previousSunday >= 1) { // First Sunday
    return (day – previousSunday) < 0;
    }
    }
    return false;
    }

    void printTime(DateTime time) {
    // Print the time in HH:MM:SS format
    Serial.print(time.hour(), DEC);
    Serial.print(‘:’);
    if (time.minute() < 10) {
    Serial.print(‘0’);
    }
    Serial.print(time.minute(), DEC);
    Serial.print(‘:’);
    if (time.second() < 10) {
    Serial.print(‘0’);
    }
    Serial.println(time.second(), DEC);
    }

    • This reply was modified 8 months ago by  David Fox.
Viewing 1 post (of 1 total)