Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функции работы со временем, ftime 
V
    Опции темы
Aline
Дата 30.6.2009, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



В программе используется функция ftime, чтобы задать текущее время в формате Unix платформы. Отсчет ведется от 01.01.1970 00:00:00. Теперь задача состоит в том, чтобы введенное пользователем время и дату перевести в этот же формат. Какую функцию можно для этого использовать? 
PM MAIL   Вверх
Keeper89
Дата 30.6.2009, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 3
Всего: 58



В каком формате дату вводит пользователь? Если в TDateTime, то
Код

/*
 Конвертация в unix timestamp
 */
 long int DateTimeToUnix(TDateTime ConvDate) {
   return floor((ConvDate.Val - 25569.0) * 86400);
 }

/*
Конвертация из unix timestamp
*/
TDateTime UnixToDateTime(long int USec) {
  TDateTime dt((USec / 86400) + 25569.0);
  return  dt;
}

http://juravskiy.ru/?p=140

Это сообщение отредактировал(а) Keeper89 - 30.6.2009, 20:16


--------------------
PM MAIL WWW   Вверх
Aline
Дата 1.7.2009, 07:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



Keeper89, пользователь вводит в TDateTime. Попробую Ваши функции, спасибо за помощь.
PM MAIL   Вверх
Aline
Дата 1.7.2009, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



Что то у меня не работает...

Может быть приведенный код как то поможет:

Код

    unsigned __int64 time= Time_count();
    
    tx_header.tx_timestamp_high= time >> 32;
    tx_header.tx_timestamp_low= time & 0xffffffff;



где Time_count - это:

Код

unsigned __int64 __fastcall TListenAFDXThread::Time_count()
{
    unsigned __int64 t= 0;

    timeb ttt;
    ftime(&ttt);

    t= ttt.time;
    t *= 1000;
    t += ttt.millitm;
    t *= 1000000;

    return t;
}


Теперь задача стоит обратная, зная tx_header.tx_timestamp_high и  tx_header.tx_timestamp_low получить time и сверить со значениями заданными пользователем.

 time = (pktinfo.tx_timestamp_high << 32) + pktinfo.tx_timestamp_low;

А промежутки времени, заданные пользователем:

unsigned __int64 beg = DateTimeToUnix(dtpTimeBeg->DateTime);
unsigned __int64 end = DateTimeToUnix(dtpTimeEnd->DateTime);

Но почему то time никак не попадает в эти промежутки, хотя должен....
т.е. условие:

if ((time >= beg)&&(time <= end)) {...}

никогда не выполняется

PM MAIL   Вверх
Aline
Дата 1.7.2009, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



Вообщем разобрались мы. Во-первых, время в наносекундах, поэтому beg и end надо умножить на 1000000000. Во вторых time неправильно считался, правильнее так:
     time = pktinfo.tx_timestamp_high;
     time = (time << 32) + pktinfo.tx_timestamp_low;

Плюс неучтен был переход на летнее время и часовой пояс
PM MAIL   Вверх
mrbrooks
Дата 1.7.2009, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306




Keeper89, это конечно все замечательно, но достаточно подключить <DateUtils.hpp> и воспользоваться услугами Билдера в лице
DateTimeToUnix / UnixToDateTime.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0506 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.