2020-06-20 14:27:58 +03:00
|
|
|
#include "Utils\TimeUtils.h"
|
|
|
|
|
|
|
|
|
|
#include "Global.h"
|
|
|
|
|
#include "Utils\StringUtils.h"
|
|
|
|
|
|
2020-06-22 03:11:02 +03:00
|
|
|
#define ONE_MINUTE_s 60
|
|
|
|
|
#define ONE_HOUR_s 60 * ONE_MINUTE_s
|
|
|
|
|
|
|
|
|
|
int getBiasInSeconds() {
|
|
|
|
|
return 3600 * jsonReadStr(configSetupJson, "timezone").toInt();
|
2020-06-20 14:27:58 +03:00
|
|
|
}
|
|
|
|
|
|
2020-06-22 03:11:02 +03:00
|
|
|
int getBiasInMinutes() {
|
|
|
|
|
return getBiasInSeconds() / 60;
|
2020-06-20 14:27:58 +03:00
|
|
|
}
|
|
|
|
|
|
2020-06-22 03:11:02 +03:00
|
|
|
const timezone getTimeZone() {
|
|
|
|
|
return timezone{getBiasInMinutes(), 0};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
time_t getSystemTime() {
|
|
|
|
|
timeval tv{0, 0};
|
|
|
|
|
timezone tz = getTimeZone();
|
|
|
|
|
time_t epoch = 0;
|
|
|
|
|
if (gettimeofday(&tv, &tz) != -1)
|
|
|
|
|
epoch = tv.tv_sec;
|
|
|
|
|
return epoch;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool hasTimeSynced() {
|
|
|
|
|
time_t now = time(nullptr);
|
|
|
|
|
return now > millis();
|
2020-06-20 14:27:58 +03:00
|
|
|
}
|
|
|
|
|
|
2020-06-20 17:12:59 +03:00
|
|
|
String getTimeUnix() {
|
2020-06-20 14:27:58 +03:00
|
|
|
time_t now = time(nullptr);
|
|
|
|
|
if (now < 30000) {
|
|
|
|
|
return "failed";
|
|
|
|
|
} else {
|
|
|
|
|
return String(now);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-20 17:12:59 +03:00
|
|
|
boolean getUnixTimeStr(String& res) {
|
|
|
|
|
time_t now = time(nullptr);
|
|
|
|
|
res = String(now);
|
|
|
|
|
return now < 30000;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
String getTime() {
|
2020-06-22 03:11:02 +03:00
|
|
|
time_t now = time(nullptr);
|
2020-06-20 14:27:58 +03:00
|
|
|
int zone = 3600 * jsonReadStr(configSetupJson, "timezone").toInt();
|
|
|
|
|
now = now + zone;
|
|
|
|
|
String Time = ""; // Строка для результатов времени
|
|
|
|
|
Time += ctime(&now); // Преобразуем время в строку формата Thu Jan 19 00:55:35 2017
|
|
|
|
|
int i = Time.indexOf(":"); //Ишем позицию первого символа :
|
|
|
|
|
Time = Time.substring(i - 2, i + 6); // Выделяем из строки 2 символа перед символом : и 6 символов после
|
|
|
|
|
return Time; // Возврашаем полученное время
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-20 22:51:14 +03:00
|
|
|
String getTimeWOsec() {
|
2020-06-22 03:11:02 +03:00
|
|
|
time_t now = time(nullptr);
|
2020-06-20 14:27:58 +03:00
|
|
|
int zone = 3600 * jsonReadStr(configSetupJson, "timezone").toInt();
|
|
|
|
|
now = now + zone;
|
|
|
|
|
String Time = ""; // Строка для результатов времени
|
|
|
|
|
Time += ctime(&now); // Преобразуем время в строку формата Thu Jan 19 00:55:35 2017
|
|
|
|
|
int i = Time.indexOf(":"); //Ишем позицию первого символа :
|
|
|
|
|
Time = Time.substring(i - 2, i + 3); // Выделяем из строки 2 символа перед символом : и 6 символов после
|
|
|
|
|
return Time; // Возврашаем полученное время
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-20 22:51:14 +03:00
|
|
|
String getDate() {
|
2020-06-22 03:11:02 +03:00
|
|
|
time_t now = time(nullptr);
|
2020-06-20 14:27:58 +03:00
|
|
|
int zone = 3600 * jsonReadStr(configSetupJson, "timezone").toInt();
|
|
|
|
|
now = now + zone;
|
|
|
|
|
String Data = ""; // Строка для результатов времени
|
|
|
|
|
Data += ctime(&now); // Преобразуем время в строку формата Thu Jan 19 00:55:35 2017
|
|
|
|
|
Data.replace("\n", "");
|
|
|
|
|
uint8_t i = Data.lastIndexOf(" "); //Ишем позицию последнего символа пробел
|
|
|
|
|
String Time = Data.substring(i - 8, i + 1); // Выделяем время и пробел
|
|
|
|
|
Data.replace(Time, ""); // Удаляем из строки 8 символов времени и пробел
|
|
|
|
|
return Data; // Возврашаем полученную дату
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-20 22:51:14 +03:00
|
|
|
String getDateDigitalFormated() {
|
|
|
|
|
String date = getDate();
|
2020-06-20 14:27:58 +03:00
|
|
|
|
|
|
|
|
date = deleteBeforeDelimiter(date, " ");
|
|
|
|
|
|
|
|
|
|
date.replace("Jan", "01");
|
|
|
|
|
date.replace("Feb", "02");
|
|
|
|
|
date.replace("Mar", "03");
|
|
|
|
|
date.replace("Apr", "04");
|
|
|
|
|
date.replace("May", "05");
|
|
|
|
|
date.replace("Jun", "06");
|
|
|
|
|
date.replace("Jul", "07");
|
|
|
|
|
date.replace("Aug", "08");
|
|
|
|
|
date.replace("Sep", "09");
|
|
|
|
|
date.replace("Oct", "10");
|
|
|
|
|
date.replace("Nov", "11");
|
|
|
|
|
date.replace("Dec", "12");
|
|
|
|
|
|
|
|
|
|
String month = date.substring(0, 2);
|
|
|
|
|
String day = date.substring(3, 5);
|
|
|
|
|
String year = date.substring(8, 10);
|
|
|
|
|
|
|
|
|
|
String out = day;
|
|
|
|
|
out += ".";
|
|
|
|
|
out += month;
|
|
|
|
|
out += ".";
|
|
|
|
|
out += year;
|
|
|
|
|
|
|
|
|
|
return out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int timeToMin(String Time) {
|
|
|
|
|
//"00:00:00" время в секунды
|
|
|
|
|
long min = selectToMarker(Time, ":").toInt() * 60; //общее количество секунд в полных часах
|
|
|
|
|
Time = deleteBeforeDelimiter(Time, ":"); // Теперь здесь минуты секунды
|
|
|
|
|
min += selectToMarker(Time, ":").toInt(); // Добавим секунды из полных минут
|
|
|
|
|
return min;
|
2020-06-20 22:51:14 +03:00
|
|
|
}
|
|
|
|
|
|
2020-06-22 03:11:02 +03:00
|
|
|
static const char* TIME_FORMAT PROGMEM = "%02d:%02d:%02d";
|
|
|
|
|
static const char* TIME_FORMAT_WITH_DAYS PROGMEM = "%dd %02d:%02d";
|
2020-06-20 22:51:14 +03:00
|
|
|
|
|
|
|
|
const String prettyMillis(unsigned long time_ms) {
|
2020-06-22 03:11:02 +03:00
|
|
|
unsigned long tmp = time_ms / 1000;
|
2020-06-20 22:51:14 +03:00
|
|
|
unsigned long seconds;
|
|
|
|
|
unsigned long minutes;
|
|
|
|
|
unsigned long hours;
|
|
|
|
|
unsigned long days;
|
|
|
|
|
seconds = tmp % 60;
|
|
|
|
|
tmp = tmp / 60;
|
|
|
|
|
|
|
|
|
|
minutes = tmp % 60;
|
|
|
|
|
tmp = tmp / 60;
|
2020-06-22 03:11:02 +03:00
|
|
|
|
2020-06-20 22:51:14 +03:00
|
|
|
hours = tmp % 24;
|
|
|
|
|
days = tmp / 24;
|
|
|
|
|
|
2020-06-22 03:11:02 +03:00
|
|
|
char buf[32];
|
2020-06-20 22:51:14 +03:00
|
|
|
|
|
|
|
|
if (days) {
|
2020-06-22 03:11:02 +03:00
|
|
|
sprintf_P(buf, TIME_FORMAT_WITH_DAYS, days, hours, minutes, seconds);
|
2020-06-20 22:51:14 +03:00
|
|
|
} else {
|
2020-06-22 03:11:02 +03:00
|
|
|
sprintf_P(buf, TIME_FORMAT, hours, minutes, seconds);
|
2020-06-20 22:51:14 +03:00
|
|
|
}
|
|
|
|
|
return String(buf);
|
|
|
|
|
}
|
2020-06-22 03:11:02 +03:00
|
|
|
|
|
|
|
|
int timeZoneInSeconds(const byte timeZone) {
|
|
|
|
|
int res = 0;
|
|
|
|
|
switch (constrain(timeZone, 1, 38)) {
|
|
|
|
|
case 1:
|
|
|
|
|
res = -12 * ONE_HOUR_s;
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
res = -11 * ONE_HOUR_s;
|
|
|
|
|
break;
|
|
|
|
|
case 3:
|
|
|
|
|
res = -10 * ONE_HOUR_s;
|
|
|
|
|
break;
|
|
|
|
|
case 4:
|
|
|
|
|
res = -9 * ONE_HOUR_s - 30 * ONE_MINUTE_s;
|
|
|
|
|
break;
|
|
|
|
|
case 5:
|
|
|
|
|
res = -9 * ONE_HOUR_s;
|
|
|
|
|
break;
|
|
|
|
|
case 6:
|
|
|
|
|
res = -8 * ONE_HOUR_s;
|
|
|
|
|
break;
|
|
|
|
|
case 7:
|
|
|
|
|
res = -7 * ONE_HOUR_s;
|
|
|
|
|
break;
|
|
|
|
|
case 8:
|
|
|
|
|
res = -6 * ONE_HOUR_s;
|
|
|
|
|
break;
|
|
|
|
|
case 9:
|
|
|
|
|
res = -5 * ONE_HOUR_s;
|
|
|
|
|
break;
|
|
|
|
|
case 10:
|
|
|
|
|
res = -4 * ONE_HOUR_s;
|
|
|
|
|
break;
|
|
|
|
|
case 11:
|
|
|
|
|
res = -3 * ONE_HOUR_s - 30 * ONE_MINUTE_s;
|
|
|
|
|
break;
|
|
|
|
|
case 12:
|
|
|
|
|
res = -3 * ONE_HOUR_s;
|
|
|
|
|
break;
|
|
|
|
|
case 13:
|
|
|
|
|
res = -2 * ONE_HOUR_s;
|
|
|
|
|
break;
|
|
|
|
|
case 14:
|
|
|
|
|
res = -1 * ONE_HOUR_s;
|
|
|
|
|
break;
|
|
|
|
|
case 15:
|
|
|
|
|
res = 0;
|
|
|
|
|
break;
|
|
|
|
|
case 16:
|
|
|
|
|
res = 1 * ONE_HOUR_s;
|
|
|
|
|
break;
|
|
|
|
|
case 17:
|
|
|
|
|
res = 2 * ONE_HOUR_s;
|
|
|
|
|
break;
|
|
|
|
|
case 18:
|
|
|
|
|
res = 3 * ONE_HOUR_s;
|
|
|
|
|
break;
|
|
|
|
|
case 19:
|
|
|
|
|
res = 3 * ONE_HOUR_s + 30 * ONE_MINUTE_s;
|
|
|
|
|
break;
|
|
|
|
|
case 20:
|
|
|
|
|
res = 4 * ONE_HOUR_s;
|
|
|
|
|
break;
|
|
|
|
|
case 21:
|
|
|
|
|
res = 4 * ONE_HOUR_s + 30 * ONE_MINUTE_s;
|
|
|
|
|
break;
|
|
|
|
|
case 22:
|
|
|
|
|
res = 5 * ONE_HOUR_s;
|
|
|
|
|
break;
|
|
|
|
|
case 23:
|
|
|
|
|
res = 5 * ONE_HOUR_s + 30 * ONE_MINUTE_s;
|
|
|
|
|
break;
|
|
|
|
|
case 24:
|
|
|
|
|
res = 5 * ONE_HOUR_s + 45 * ONE_MINUTE_s;
|
|
|
|
|
break;
|
|
|
|
|
case 25:
|
|
|
|
|
res = 6 * ONE_HOUR_s;
|
|
|
|
|
break;
|
|
|
|
|
case 26:
|
|
|
|
|
res = 6 * ONE_HOUR_s + 30 * ONE_MINUTE_s;
|
|
|
|
|
break;
|
|
|
|
|
case 27:
|
|
|
|
|
res = 7 * ONE_HOUR_s;
|
|
|
|
|
break;
|
|
|
|
|
case 28:
|
|
|
|
|
res = 8 * ONE_HOUR_s;
|
|
|
|
|
break;
|
|
|
|
|
case 29:
|
|
|
|
|
res = 8 * ONE_HOUR_s + 45 * ONE_MINUTE_s;
|
|
|
|
|
break;
|
|
|
|
|
case 30:
|
|
|
|
|
res = 9 * ONE_HOUR_s;
|
|
|
|
|
break;
|
|
|
|
|
case 31:
|
|
|
|
|
res = 9 * ONE_HOUR_s + 30 * ONE_MINUTE_s;
|
|
|
|
|
break;
|
|
|
|
|
case 32:
|
|
|
|
|
res = 10 * ONE_HOUR_s;
|
|
|
|
|
break;
|
|
|
|
|
case 33:
|
|
|
|
|
res = 10 * ONE_HOUR_s + 30 * ONE_MINUTE_s;
|
|
|
|
|
break;
|
|
|
|
|
case 34:
|
|
|
|
|
res = 11 * ONE_HOUR_s;
|
|
|
|
|
break;
|
|
|
|
|
case 35:
|
|
|
|
|
res = 12 * ONE_HOUR_s;
|
|
|
|
|
break;
|
|
|
|
|
case 36:
|
|
|
|
|
res = 12 * ONE_HOUR_s + 45 * ONE_MINUTE_s;
|
|
|
|
|
break;
|
|
|
|
|
case 37:
|
|
|
|
|
res = 13 * ONE_HOUR_s;
|
|
|
|
|
break;
|
|
|
|
|
case 38:
|
|
|
|
|
res = 14 * ONE_HOUR_s;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return res;
|
|
|
|
|
}
|