Skip to content

Commit

Permalink
добавлен перевод времени с CET на GMT и обратно
Browse files Browse the repository at this point in the history
  • Loading branch information
NewYaroslav committed Jul 26, 2018
1 parent e524e52 commit 96b43ea
Show file tree
Hide file tree
Showing 3 changed files with 277 additions and 0 deletions.
47 changes: 47 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,10 @@ unsigned long long unixEpoch = 1527120000;
// Второй вариант функции для определения дня недели
wday = getWday(1527120000);
// Получить день недели через функцию класса cTime
cTime iTime(24,5,2018);
wday = iTime.getWday();
```
+ Конвертировать строку в формате ISO в данные класса cTime
```
Expand All @@ -80,10 +84,53 @@ if(converISO(strISOformattedUTCdatetime, iTime) == true) {
iTime.print();
}
```
+ Перевод времени CET во время GMT и обратно с учетом перехода на зимнее время
```
using namespace FunctionsForTime;
// получаем время GMT для примера
cTime startTime(20,3,2018);
unsigned long long startGMT = startTime.getUnixTime();
// переводим время GMT во время CET
cTime realCET(convertGmtToCet(startGMT));
realCET.print();
// переводим время CET во время GMT
cTime realGMT(convertCetToGmt(realCET.getUnixTime()));
realGMT.print();
```
+ Получить Unix-время компьютера
```
using namespace FunctionsForTime;
unsigned long long t = getUnixTime();
std::string str = getStrTime(); // В строке время будет предсталвено как в примере (24.05.2018 00:00:00)
```
+ Получить количество дней в месяце
```
using namespace FunctionsForTime;
int month = 2;
int year = 2018;
std::cout << getNumDaysMonth(month, year) << std::endl;
cTime iTime(20,3,2018);
// Получить количество дней в текущем (март) месяце
std::cout << iTime.getNumDaysCurrentMonth() << std::endl;
```
+ Проверка високосного года
```
using namespace FunctionsForTime;
int year = 2018;
if(isLeapYear(year)) {
// если год високосный, то условие сработает
}
cTime iTime(20,3,2018);
if(iTime.isLeapYear()) {
// если год високосный, то условие сработает
}
```


184 changes: 184 additions & 0 deletions src/xtime.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,18 @@ namespace FunctionsForTime {
return std::string(text);
}

int cTime::getWday() {
return FunctionsForTime::getWday(day, month, year);
}

bool cTime::isLeapYear() {
return FunctionsForTime::isLeapYear(year);
}

int cTime::getNumDaysCurrentMonth() {
return getNumDaysMonth(month, year);
}

bool converISO(std::string strISOformattedUTCdatetime, cTime& t) {
std::string& word = strISOformattedUTCdatetime;
// íàõîäèì äàòó è âðåìÿ
Expand Down Expand Up @@ -277,4 +289,176 @@ namespace FunctionsForTime {
t.setUnixTime(getUnixTime());
return t.getStr();
}

bool isLeapYear(int year) {
if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) return true;
return false;
}

int getNumDaysMonth(int month, int year) {
if(month > 12) return 0;
const int numDays[13] = {0,31,30,31,30,31,30,31,31,30,31,30,31};
if(month == 2) {
if(isLeapYear(year)) return 29;
else return 28;
} else {
return numDays[month];
}
}

unsigned long long convertGmtToCet(unsigned long long gmt) {
const unsigned long long ONE_HOUR = 3600;
const int OLD_START_SUMMER_HOUR = 2;
const int OLD_STOP_SUMMER_HOUR = 3;
const int NEW_SUMMER_HOUR = 1;
const int MONTH_MARSH = 3;
const int MONTH_OCTOBER = 10;
cTime iTime(gmt);
int maxDays = iTime.getNumDaysCurrentMonth();
if(iTime.year < 2002) {
// Äî 2002 ãîäà â Åâðîïå ïåðåõîä íà ëåòíåå âðåìÿ îñóùåñòâëÿëñÿ â ïîñëåäíåå âîñêðåñåíüå ìàðòà â 2:00 ïåðåâîäîì ÷àñîâ íà 1 ÷àñ âïåð¸ä
// à îáðàòíûé ïåðåõîä îñóùåñòâëÿëñÿ â ïîñëåäíåå âîñêðåñåíüå îêòÿáðÿ â 3:00 ïåðåâîäîì íà 1 ÷àñ íàçàä
if(iTime.month > MONTH_MARSH && iTime.month < MONTH_OCTOBER) { // ëåòíåå âðåìÿ
return gmt + ONE_HOUR * 2;
} else
if(iTime.month == MONTH_MARSH) {
for(int d = maxDays; d >= iTime.day; d--) {
int _wday = getWday(d, MONTH_MARSH, iTime.year);
if(_wday == SUN) {
if(d == iTime.day) { // åñëè ñåé÷àñ âîñêðåñåíüå
if(iTime.hour + 1 >= OLD_START_SUMMER_HOUR) return gmt + ONE_HOUR * 2; // ëåòíåå âðåìÿ
return gmt + ONE_HOUR; // çèìíåå âðåìÿ
}
return gmt + ONE_HOUR; // çèìíåå âðåìÿ
}
}
return gmt + ONE_HOUR * 2; // ëåòíåå âðåìÿ
} else
if(iTime.month == MONTH_OCTOBER) {
for(int d = maxDays; d >= iTime.day; d--) {
int _wday = getWday(d, MONTH_OCTOBER, iTime.year);
if(_wday == SUN) {
if(d == iTime.day) { // åñëè ñåé÷àñ âîñêðåñåíüå
if(iTime.hour + 2 >= OLD_STOP_SUMMER_HOUR) return gmt + ONE_HOUR; // çèìíåå âðåìÿ
return gmt + ONE_HOUR; // çèìíåå âðåìÿ
}
return gmt + ONE_HOUR * 2; // ëåòíåå âðåìÿ
}
}
return gmt + ONE_HOUR; // çèìíåå âðåìÿ
}
return gmt + ONE_HOUR; // çèìíåå âðåìÿ
} else {
// Íà÷èíàÿ ñ 2002 ãîäà, ñîãëàñíî äèðåêòèâå ÅÑ(2000/84/EC) â Åâðîïå ïåðåõîä íà ëåòíåå âðåìÿ îñóùåñòâëÿåòñÿ â 01:00 ïî Ãðèíâè÷ó.
if(iTime.month > MONTH_MARSH && iTime.month < MONTH_OCTOBER) { // ëåòíåå âðåìÿ
return gmt + ONE_HOUR * 2;
} else
if(iTime.month == MONTH_MARSH) {
for(int d = maxDays; d >= iTime.day; d--) {
int _wday = getWday(d, MONTH_MARSH, iTime.year);
if(_wday == SUN) {
if(d == iTime.day) { // åñëè ñåé÷àñ âîñêðåñåíüå
if(iTime.hour >= NEW_SUMMER_HOUR) return gmt + ONE_HOUR * 2; // ëåòíåå âðåìÿ
return gmt + ONE_HOUR; // çèìíåå âðåìÿ
}
return gmt + ONE_HOUR; // çèìíåå âðåìÿ
}
}
return gmt + ONE_HOUR * 2; // ëåòíåå âðåìÿ
} else
if(iTime.month == MONTH_OCTOBER) {
for(int d = maxDays; d >= iTime.day; d--) {
int _wday = getWday(d, MONTH_OCTOBER, iTime.year);
if(_wday == SUN) {
if(d == iTime.day) { // åñëè ñåé÷àñ âîñêðåñåíüå
if(iTime.hour >= NEW_SUMMER_HOUR) return gmt + ONE_HOUR; // çèìíåå âðåìÿ
return gmt + ONE_HOUR * 2; // ëåòíåå âðåìÿ
}
return gmt + ONE_HOUR * 2; // ëåòíåå âðåìÿ
}
}
return gmt + ONE_HOUR; // çèìíåå âðåìÿ
}
return gmt + ONE_HOUR; // çèìíåå âðåìÿ
}
return gmt + ONE_HOUR; // çèìíåå âðåìÿ
}

unsigned long long convertCetToGmt(unsigned long long cet) {
const unsigned long long ONE_HOUR = 3600;
const int OLD_START_SUMMER_HOUR = 2;
const int OLD_STOP_SUMMER_HOUR = 3;
const int NEW_SUMMER_HOUR = 1;
const int MONTH_MARSH = 3;
const int MONTH_OCTOBER = 10;
cTime iTime(cet);
int maxDays = iTime.getNumDaysCurrentMonth();
if(iTime.year < 2002) {
// Äî 2002 ãîäà â Åâðîïå ïåðåõîä íà ëåòíåå âðåìÿ îñóùåñòâëÿëñÿ â ïîñëåäíåå âîñêðåñåíüå ìàðòà â 2:00 ïåðåâîäîì ÷àñîâ íà 1 ÷àñ âïåð¸ä
// à îáðàòíûé ïåðåõîä îñóùåñòâëÿëñÿ â ïîñëåäíåå âîñêðåñåíüå îêòÿáðÿ â 3:00 ïåðåâîäîì íà 1 ÷àñ íàçàä
if(iTime.month > MONTH_MARSH && iTime.month < MONTH_OCTOBER) { // ëåòíåå âðåìÿ
return cet - ONE_HOUR * 2;
} else
if(iTime.month == MONTH_MARSH) {
for(int d = maxDays; d >= iTime.day; d--) {
int _wday = getWday(d, MONTH_MARSH, iTime.year);
if(_wday == SUN) {
if(d == iTime.day) { // åñëè ñåé÷àñ âîñêðåñåíüå
if(iTime.hour >= OLD_START_SUMMER_HOUR) return cet - ONE_HOUR * 2; // ëåòíåå âðåìÿ
return cet - ONE_HOUR; // çèìíåå âðåìÿ
}
return cet - ONE_HOUR; // çèìíåå âðåìÿ
}
}
return cet - ONE_HOUR * 2; // ëåòíåå âðåìÿ
} else
if(iTime.month == MONTH_OCTOBER) {
for(int d = maxDays; d >= iTime.day; d--) {
int _wday = getWday(d, MONTH_OCTOBER, iTime.year);
if(_wday == SUN) {
if(d == iTime.day) { // åñëè ñåé÷àñ âîñêðåñåíüå
if(iTime.hour >= OLD_STOP_SUMMER_HOUR) return cet - ONE_HOUR; // çèìíåå âðåìÿ
return cet - ONE_HOUR; // çèìíåå âðåìÿ
}
return cet - ONE_HOUR * 2; // ëåòíåå âðåìÿ
}
}
return cet - ONE_HOUR; // çèìíåå âðåìÿ
}
return cet - ONE_HOUR; // çèìíåå âðåìÿ
} else {
// Íà÷èíàÿ ñ 2002 ãîäà, ñîãëàñíî äèðåêòèâå ÅÑ(2000/84/EC) â Åâðîïå ïåðåõîä íà ëåòíåå âðåìÿ îñóùåñòâëÿåòñÿ â 01:00 ïî Ãðèíâè÷ó.
if(iTime.month > MONTH_MARSH && iTime.month < MONTH_OCTOBER) { // ëåòíåå âðåìÿ
return cet - ONE_HOUR * 2;
} else
if(iTime.month == MONTH_MARSH) {
for(int d = maxDays; d >= iTime.day; d--) {
int _wday = getWday(d, MONTH_MARSH, iTime.year);
if(_wday == SUN) {
if(d == iTime.day) { // åñëè ñåé÷àñ âîñêðåñåíüå
if(iTime.hour - 2 >= NEW_SUMMER_HOUR) return cet - ONE_HOUR * 2; // ëåòíåå âðåìÿ
return cet - ONE_HOUR; // çèìíåå âðåìÿ
}
return cet - ONE_HOUR; // çèìíåå âðåìÿ
}
}
return cet - ONE_HOUR * 2; // ëåòíåå âðåìÿ
} else
if(iTime.month == MONTH_OCTOBER) {
for(int d = maxDays; d >= iTime.day; d--) {
int _wday = getWday(d, MONTH_OCTOBER, iTime.year);
if(_wday == SUN) {
if(d == iTime.day) { // åñëè ñåé÷àñ âîñêðåñåíüå
if(iTime.hour - 1 >= NEW_SUMMER_HOUR) return cet - ONE_HOUR; // çèìíåå âðåìÿ
return cet - ONE_HOUR * 2; // ëåòíåå âðåìÿ
}
return cet - ONE_HOUR * 2; // ëåòíåå âðåìÿ
}
}
return cet - ONE_HOUR; // çèìíåå âðåìÿ
}
return cet - ONE_HOUR; // çèìíåå âðåìÿ
}
return cet - ONE_HOUR; // çèìíåå âðåìÿ
}
}
46 changes: 46 additions & 0 deletions src/xtime.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,21 @@ namespace FunctionsForTime {
* \return ñòðîêà, ñîäåðæàùàÿ äàòó è âðåìÿ
*/
std::string getStr();

/** \brief Ïîëó÷èòü äåíü íåäåëè
* \return äåíü íåäåëè (SUN = 0, MON = 1, ... SAT = 6)
*/
int getWday();

/** \brief Ïðîâåðêà âèñîêîñíîãî ãîäà
* \return âåðíåò true, åñëè ãîä âèñîêîñíûé
*/
bool isLeapYear();

/** \brief Ïîëó÷èòü êîëè÷åñòâî äíåé â òåêóùåì ìåñÿöå
* \return êîëè÷åñòâî äíåé
*/
int getNumDaysCurrentMonth();
};

/** \brief Êîíâåðòèðîâàòü ñòðîêó â ôîðìàòå ISO â äàííûå êëàññà cTime
Expand Down Expand Up @@ -162,6 +177,37 @@ namespace FunctionsForTime {
* \param unix âðåìÿ â ôîðìàòå timestamp
*/
void printDateAndTime(unsigned long long unix);

/** \brief Ïðîâåðêà âèñîêîñíîãî ãîäà
* \param year ãîä
* \return âåðíåò true, åñëè ãîä âèñîêîñíûé
*/
bool isLeapYear(int year);

/** \brief Ïîëó÷èòü êîëè÷åñòâî äíåé â ìåñÿöå
* \param month ìåñÿö
* \param year ãîä
* \return êîëè÷åñòâî äíåé â ìåñÿöå
*/
int getNumDaysMonth(int month, int year);

/** \brief Ïåðåâîäèò âðåìÿ GMT âî âðåìÿ CET
* Äî 2002 ãîäà â Åâðîïå ïåðåõîä íà ëåòíåå âðåìÿ îñóùåñòâëÿëñÿ â ïîñëåäíåå âîñêðåñåíüå ìàðòà â 2:00 ïåðåâîäîì ÷àñîâ íà 1 ÷àñ âïåð¸ä
* à îáðàòíûé ïåðåõîä îñóùåñòâëÿëñÿ â ïîñëåäíåå âîñêðåñåíüå îêòÿáðÿ â 3:00 ïåðåâîäîì íà 1 ÷àñ íàçàä
* Íà÷èíàÿ ñ 2002 ãîäà, ñîãëàñíî äèðåêòèâå ÅÑ(2000/84/EC) â Åâðîïå ïåðåõîä íà ëåòíåå âðåìÿ îñóùåñòâëÿåòñÿ â 01:00 ïî Ãðèíâè÷ó.
* \param gmt Âðåìÿ GMT
* \return âðåìÿ CET
*/
unsigned long long convertGmtToCet(unsigned long long gmt);

/** \brief Ïåðåâîäèò âðåìÿ CET âî âðåìÿ GMT
* Äî 2002 ãîäà â Åâðîïå ïåðåõîä íà ëåòíåå âðåìÿ îñóùåñòâëÿëñÿ â ïîñëåäíåå âîñêðåñåíüå ìàðòà â 2:00 ïåðåâîäîì ÷àñîâ íà 1 ÷àñ âïåð¸ä
* à îáðàòíûé ïåðåõîä îñóùåñòâëÿëñÿ â ïîñëåäíåå âîñêðåñåíüå îêòÿáðÿ â 3:00 ïåðåâîäîì íà 1 ÷àñ íàçàä
* Íà÷èíàÿ ñ 2002 ãîäà, ñîãëàñíî äèðåêòèâå ÅÑ(2000/84/EC) â Åâðîïå ïåðåõîä íà ëåòíåå âðåìÿ îñóùåñòâëÿåòñÿ â 01:00 ïî Ãðèíâè÷ó.
* \param cet Âðåìÿ CET
* \return âðåìÿ GMT
*/
unsigned long long convertCetToGmt(unsigned long long cet);
}

#endif // XTIME_HPP_INCLUDED

0 comments on commit 96b43ea

Please sign in to comment.