Я очень уважаю то, что собрал Говард, но мне нужно было что-то, что выполнялось бы как можно быстрее, и я беспокоился о включении всей библиотеки дат, когда все, что мне было нужно, это от int
до date
.
Вот что я придумал:
string GetDateFromDaysSincePointInTime(int days)
{
int a, b, c, d, e, m, dd, mm, yyyy;
a = days + 2374475;
b = (4 * a + 3) / 146097;
c = -b * 146097 / 4 + a;
d = (4 * c + 3) / 1461;
e = -1461 * d / 4 + c;
m = (5 * e + 2) / 153;
dd = -(153 * m + 2) / 5 + e + 1;
mm = -m / 10 * 12 + m + 3;
yyyy = b * 100 + d - 4800 + m / 10;
return to_string(yyyy) + "-" + to_string(mm) + '-' + to_string(dd);
}
Чтобы использовать это, просто назовите его с помощью int GetDateFromDaysSincePointInTime(113908)
. Это даст вам дату. Предполагая, что моя начальная точка отличается от вашей начальной точки, перейдите на сайт https://www.timeanddate.com/date/dateadd.html и добавьте / вычтите желаемую дату из даты, которая была выведена. Затем измените значение int для переменной a
на эту сумму и снова запустите, чтобы получить исправленную дату.
Оттуда ее можно легко изменить, чтобы при желании иметь начальные нули:
std::ostringstream month;
month << std::setw(2) << std::setfill('0') << mm;
std::ostringstream day;
day << std::setw(2) << std::setfill('0') << dd;
return to_string(yyyy) + "-" + month.str() + '-' + day.str()
Альтернативный способ
Вот еще один способ, который является более читабельным, и, кажется, нет никакого реального снижения производительности на 30 000 записей:
string GetDateFromInt(int days)
{
int startYear = 1600;
int year = days / 365.2421875;
float peryear = 365.2421875;
int remainder = fmod(days, peryear); // here you could add what day of the year to get a date in the middle of the year
bool leapyear= ((year & 3) == 0 && (year % 100 != 0));
int leapYearIndex = leapyear ? 1 : 0;
int daysInYear = leapYearIndex ? 366 : 365;
const unsigned short int __mon_yday[2][13] =
{
/* Normal years. */
{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
/* Leap years. */
{ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
};
int dayOfYear = remainder;
if (dayOfYear >= 1 && dayOfYear <= daysInYear) {
for (int mon = 0; mon < 12; mon++) {
if (dayOfYear <= __mon_yday[leapYearIndex][mon + 1]) {
int month = mon + 1;
int dayOfMonth = dayOfYear - __mon_yday[leapYearIndex][mon];
std::ostringstream months;
months << std::setw(2) << std::setfill('0') << month;
std::ostringstream day;
day << std::setw(2) << std::setfill('0') << dayOfMonth;
return to_string(startYear + year) + "-" + months.str() + '-' + day.str();
}
}
}
}