| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Перевод даты и времени в секунды |
| Автор: Ivan_S 30.8.2004, 14:56 |
| У кого нибудь есть функция перевода даты и времени в секунды и обратно. можно на любом языке. Необходимо перевести время в число секунд прошедшее до этого момента с 0:00:00 01.01.2000 и обратно. Это число кокрас влезает в long |
| Автор: Domestic Cat 30.8.2004, 16:57 | ||
На Java пойдет? (извиняюсь что не C++, но вроде нужно на любом языке)
|
| Автор: Олег М 31.8.2004, 05:40 | ||
Переводи в FILETIME, например SystemTimeToFileTime, там время хранится с точностью до 100 нс, не помню сколько это в секундах, вроде бы одна десятитысячная. Дели на 10000 и всё. |
| Автор: Ivan_S 31.8.2004, 09:02 |
| Проблема в том, что я пишу программу под микросхему "ATMega8", в котором только голый C, даже не C++. И нет ни каких дополнительных функций для работы со временем и датой. Программа должна считывать информацию с микросхемы DS1307, которая возвращает текущую дату и время в виде ......|.BIT7.|..........|..........|..........|..........|..........|..........|.BIT0...| ......------------------------------------------------------------------------- 00H|...CH..|......10.Seconds........|..............Seconds.................|..00-59 ......------------------------------------------------------------------------- ......|....0....|......10.Minutes.........|..............Minutes..................|..00-59 ......------------------------------------------------------------------------- ......|....0....|..12 /.|10 HR.|10.HR.|.................Hours..................|..1-12 ......|..........|....24.|..A/P...|..........|.............................................|..00-23 ......------------------------------------------------------------------------- ......|....0....|....0...|....0....|....0....|....0....|.............Day...............|..1-7 ......------------------------------------------------------------------------- ......|....0....|....0...|.....10 Date....|..................Date...................|..01-28/29;..01-30;..01-31 ......------------------------------------------------------------------------- ......|....0....|....0...|....0....|10.Mo|...................Month.................|..01-12 ......------------------------------------------------------------------------- ......|...............10 Year................|..................Year...................|..00-99 ......------------------------------------------------------------------------- перевести это в long и вместе с другими замеренными параметрами записать во Flash память. Функцию перевода в long я написал: //---------------------------------------------------------------------------------------------------- #define CharData(_data, _pos) _data[_pos] #define uchar unsigned char #define uint unsigned int #define ulong unsigned long //---------------------------------------------------------------------------------------------------- uint MONTH[12]={0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; ulong getSec(const uchar *DateTime){ uint gYear=CharData(DateTime, 6); gYear=(gYear&0x0F)+((gYear&0xF0)>>1)+((gYear&0xF0)>>3); uint gMonth=CharData(DateTime, 5)&0x1F; gMonth=(gMonth&0x0F)+((gMonth&0x10)>>1)+((gMonth&0x10)>>3); uint gDate=CharData(DateTime, 4)&0x3F; gDate=(gDate&0x0F)+((gDate&0x30)>>1)+((gDate&0x30)>>3); uint gDay=gYear*365+((gYear+3)>>2); gDay+=MONTH[gMonth-1]+((gMonth>2) ?!(gYear%4) :0); gDay+=gDate-1; uint gHours=CharData(DateTime, 2)&0x3F; gHours=(gHours&0x0F)+((gHours&0x30)>>1)+((gHours&0x30)>>3); uint gMinutes=CharData(DateTime, 1)&0x7F; gMinutes=(gMinutes&0x0F)+((gMinutes&0x70)>>1)+((gMinutes&0x70)>>3); ulong gSeconds=CharData(DateTime, 0)&0x7F; gSeconds=(gSeconds&0x0F)+((gSeconds&0x70)>>1)+((gSeconds&0x70)>>3); gSeconds=(ulong)gDay*86400+gHours*3600+gMinutes*60+gSeconds; return gSeconds; } //---------------------------------------------------------------------------------------------------- , а обратно уже замаелся |
| Автор: Олег М 31.8.2004, 11:12 |
| Ivan_S задача вроде халявная - опиши словами данные с микросхемы, а то так врубиться не могу. |
| Автор: Ivan_S 1.9.2004, 11:06 |
| микросхема возвращает 8 байт: 00h - секунды 01h - минуты 02h - часы 03h - день недели 04h - дата 05h - месяц 06h - год 07h - системный байт все значения имеют формат BCD (двоично-десятичный код). младшие 4 бита - младшая цифра, старшие 4 бита - старшая цифра. Микросхема автоматически учитывает высокосный год. необходимо перевести все значения часов в нормальный вид и подсчитать абсолютное число секунд от начала счетчика и обратно. |
| Автор: Олег М 1.9.2004, 13:44 | ||
Не так просто оказалось - вот что накидал - как работает не проверял, но общий смысл понятен
А вообще - посмотри исходники стандартных сишных функций, типа gmtime и localtime - они в вижал студии есть. |
| Автор: Ivan_S 2.9.2004, 12:01 | ||
сделал. кому надо - берите
Все функции протестированы. циклически проверены все варианты - результаты сходятся. |