реклама на сайте
подробности

 
 
> перевод даты в юникс секунды, нужен код на си
super_puper
сообщение Aug 24 2015, 08:57
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 222
Регистрация: 14-12-12
Из: новосибирск
Пользователь №: 74 845



думал это очень распространено но потратил 2 часа не нашел кода на си для такой типичной операции.

формат: год месяц день минуты секунды перевести в секунды с 1970 года

желательно проверенный красивый код и наверное без циклов)

Сообщение отредактировал super_puper - Aug 24 2015, 09:05
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
jcxz
сообщение Aug 25 2015, 07:15
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(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;
}
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 15:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.01495 секунд с 7
ELECTRONIX ©2004-2016