Минимальная реализация алгоритма gmtime?
Кто-нибудь знает о простом gmtime
или же ctime
реализация без учета часового пояса, без внешних зависимостей и лицензии без авторского лева (BSD/MIT/ что-нибудь проприетарное-безопасное)? Предпочтительно в C, но в основном все, что дает мне алгоритм в его минимальной форме, будет работать.
Мне просто нужны секунды с тех пор, как "1 января 1970 00:00:00" было разбито на год, день, месяц, часы, минуты, секунды. И уже почти пора домой в пятницу, поэтому я чувствую себя немного ленивым.
3 ответа
Попробуйте newlib http://sourceware.org/newlib/ это лицензия BSD.
Он предназначен для встраиваемых систем, поэтому имеет тенденцию быть довольно маленьким и простым.
Посмотрите Docs -> Timefns, чтобы увидеть, соответствуют ли ctime или gmtime вашим потребностям.
Обратный алгоритм, определяющий "секунды с начала эпохи" из POSIX:
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html
tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 +
(tm_year-70)*31536000 + ((tm_year-69)/4)*86400 -
((tm_year-1)/100)*86400 + ((tm_year+299)/400)*86400
Еще одна короткая реализация C с лицензией MIT, которая работает с time_t любого размера (32 бита, 64 бита и т. д.):
Сборка i386, оптимизированная по размеру, с 32-битным time_t:
Сравнение размера скомпилированного кода (оптимизировано для i386, с 32-битным time_t):
- Newlib C: 444 байта. Также эта реализация не соответствует POSIX для отрицательных лет (т. е. до н. э.).
- https://github.com/pts/minilibc686/blob/master/fyi/c_gmtime.cminilibc686 C : 222 байта
- https://github.com/pts/minilibc686/blob/master/src/gmtime_r.nasmсборка minilibc686 i386 : 180 байт