Calcule le décalage horaire en France (+1 en été, +2 en hiver) à partir d'une heure UTC et d'une date.

Fork of FrenchTime by Julien Castello

FrenchTime.cpp

Committer:
Marcus_2B
Date:
2016-11-23
Revision:
6:803a1cf4eb73
Parent:
5:cf036371055d

File content as of revision 6:803a1cf4eb73:

#include "FrenchTime.h"




uint8_t FrenchTime::frenchTimeOffset(uint8_t day, uint8_t month, int year)
{
    //Avril, Mai, Juin, Juillet, Aout, Septembre
    if (month > MARS && month < OCTOBRE) {
        return UTC_TIME_OFFSET + 1;
    }
    // Janvier, Février, Novembre, Décembre
    else if (month < MARS || month > OCTOBRE) {
        return UTC_TIME_OFFSET;
    }
    //Mars ou Octobre
    else {
        if (MARS == month) {
            if (day >= lastSundayOfMonth(month, year)) {
                return UTC_TIME_OFFSET + 1;
            }
        }
        //OCTOBRE
        else {
            if (day < lastSundayOfMonth(month, year)) {
                return UTC_TIME_OFFSET + 1;
            }
        }
        return UTC_TIME_OFFSET;
    }
}



uint8_t FrenchTime::lastSundayOfMonth(uint8_t m, int y)
{
    for (uint8_t d = DAYS_IN_MARS; d >= 1; d--) {

        if (FrenchTime::dayOfWeek(d, m, y) == 0) {
            return d;
        }
    }
    return 0;
}



uint8_t FrenchTime::dayOfWeek(uint8_t d, uint8_t m, int y)
{
    //Algorithme de Mike Keith
    int weekDay = 0, z = 0;

    if (m >= 3) {
        z = y;
        weekDay = (((23 * m) / 9) + d + 4 + y + (z / 4) - (z / 100) + (z / 400) - 2) % 7;
    } else {
        z = y - 1;
        weekDay = (((23 * m) / 9) + d + 4 + y + (z / 4) - (z / 100) + (z / 400)) % 7;
    }
    return (uint8_t)weekDay;
}