Возвращает юникс таймстэмп микросекундами возвращает отрицательное чис

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
/*
* Возвращает юникс таймстэмп с микросекундами, возвращает отрицательное число в случае ошибки
*/
long long Utility::MakeDateTime(const std::wstring& timestring, const std::wstring& format)
{
long long result = -1;
// посплитаем стороку времени по точке для вычисления микросекунд
SSHPO::StringArrayW dtstringparts0;
Utility::Split(dtstringparts0, timestring, L'.');
// микросекунды будут без нулей, поэтому дополним их нулями, чтобы было 6 цифр
// например из 0.25 мы получим 25, хотя это 250000 мкс
// добавим 6-2 нулей, затем можно конвертировать в целое
// если микросекунд больше 6-ти знаков, тогда обрежем просто
if (dtstringparts0[1].size() > 6)
{
dtstringparts0[1].erase(6);
}
std::wstring microseconds = dtstringparts0[1] + std::wstring(6 - dtstringparts0[1].size(), L'0');
long long mcs = Wtol(microseconds);
int seconds = -1;
int minutes = -1;
int hours = -1;
int day = -1;
int month = -1;
int year = -1;
std::size_t offset = std::wstring::npos;
// найдем секунды
offset = format.find(L"ss");
if (offset != std::wstring::npos)
{
seconds = std::stoi(std::wstring(timestring, offset, 2));
}
// найдем минуты
offset = format.find(L"mm");
if (offset != std::wstring::npos)
{
minutes = std::stoi(std::wstring(timestring, offset, 2));
}
// найдем часы
offset = format.find(L"HH");
if (offset != std::wstring::npos)
{
hours = std::stoi(std::wstring(timestring, offset, 2));
}
// найдем дни
offset = format.find(L"dd");
if (offset != std::wstring::npos)
{
day = std::stoi(std::wstring(timestring, offset, 2));
}
// найдем месяц
offset = format.find(L"MM");
if (offset != std::wstring::npos)
{
month = std::stoi(std::wstring(timestring, offset, 2));
}
// найдем год
offset = format.find(L"yyyy");
if (offset != std::wstring::npos)
{
year = std::stoi(std::wstring(timestring, offset, 4));
}
else
{
offset = format.find(L"yy");
if (offset != std::wstring::npos)
{
year = std::stoi(std::wstring(timestring, offset, 2));
}
}
// если хотя бы один элемент даты отсутствует, мы не можем пропарсить дату и время корректно
if (seconds != -1 && minutes != -1 && hours != -1 && day != -1 && month != -1 && year != -1)
{
// int tm_sec; seconds after the minute - [0,59]
// int tm_min; minutes after the hour - [0,59]
// int tm_hour; hours since midnight - [0,23]
// int tm_mday; day of the month - [1,31]
// int tm_mon; months since January - [0,11]
// int tm_year; years since 1900
// int tm_wday; days since Sunday - [0,6]
// int tm_yday; days since January 1 - [0,365]
// int tm_isdst; daylight savings time flag
tm t = { seconds, minutes, hours,
day, month-1,
year > 1900 ? year - 1900 : year + 100,
0, 0, -1 };
// mktime возвращает -1 в случае ошибки
// поэтому result будет отрицательным в любом случае
// ошибочной конвертации
result = _mktime64(&t) * 1000000 + mcs;
}
return result;
}