Цитата(super_puper @ Aug 24 2015, 14:57)

думал это очень распространено но потратил 2 часа не нашел кода на си для такой типичной операции.
Для операции "/=" тоже примеры кода в инете ищете?
Функция Encode() преобразует дату в секунды с любым базовым годом, не обязательно 1970:
CODE
#define BASE_YEAR 2011 //базовый год Службы времени
#define N_YEARS 136 //кол-во лет, охватываемых Службой времени
//(служба времени работоспособна от BASE_YEAR года до (BASE_YEAR+N_YEARS-1) года включительно)
u8 const month2days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
struct DateTime {
u8 seconds, minutes, hours, date, month, day;
u16 year;
u32 Encode() const;
int Set(u32);
};
//кол-во дней перед началом года 'y'
#define daysBeforeYear(y) ((u32)((y) - 1) * 365 + \
(u32)((y) - 1) / 4 - (u32)((y) - 1) / 100 + (u32)((y) - 1) / 400)
//кол-во дней, охватываемых Службой времени (макс. диапазон времени в днях)
#define N_DAYS (daysBeforeYear(BASE_YEAR+N_YEARS) - daysBeforeYear(BASE_YEAR))
//возвращает true - если год невисокосный, false - иначе
u32 isNoVisokos(u32 year)
{
u32 c, i;
if (!(c = (i = year) & 3)) if ((i /= 100) * 100 == year) c = i & 3;
return c;
}
//преобразует DateTime в кол-во секунд от начала BASE_YEAR
//при ошибке возвращает ~0
//член day - игнорируется
u32 DateTime::Encode() const
{
u32 cc, i, j;
u8 const *s;
if ((cc = year) - BASE_YEAR >= N_YEARS) return ~0;
j = daysBeforeYear(cc) - daysBeforeYear(BASE_YEAR);
if ((i = month) > 11) return ~0;
s = month2days;
while ((s32)--i >= 0) j += *s++;
i = *s;
if (!isNoVisokos(cc)) {
if ((uint)month > 1) j++;
if (month == 1) i++;
}
if (date >= i) return ~0;
j = (date + j) * 24;
if ((uint)hours > 23) return ~0;
j = (hours + j) * 60;
if ((uint)minutes > 59) return ~0;
j = (minutes + j) * 60;
if ((uint)seconds > 59) return ~0;
return seconds + j;
}