Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Время как длинное целое, Обработать время 
:(
    Опции темы
mrbrooks
Дата 29.10.2007, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Комрады! У есть время как long integer (к примеру 318739256308000 в микросекундах!). Можно ли его преобразовать в божеский вид - хотя бы до минуты - секунды - миллисекунды?
PM MAIL   Вверх
Lazin
Дата 29.10.2007, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Код

LONG_INTEGER ftime; - 64х битное целое в UTC, тоесть количество 100 нс интервалов с 1го января 1601го года
SYSTEMTIME stime;
FileTimeToSystemtime(&ftime, &stime);



Это сообщение отредактировал(а) Lazin - 29.10.2007, 15:45
PM MAIL Skype GTalk   Вверх
mrbrooks
Дата 29.10.2007, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



и что я должен сделать с ftime? у меня написано что это вообще мол структура. И куды в нее впихивать 318739256308000 я что то не догоняю.  smile 
PM MAIL   Вверх
Lazin
Дата 29.10.2007, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



так не пробовал?
Код

long integer ftime;
FileTimeToSystemtime( (LONG_INTEGER*)&ftime, &stime);


Это сообщение отредактировал(а) Lazin - 29.10.2007, 15:44
PM MAIL Skype GTalk   Вверх
mrbrooks
Дата 29.10.2007, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



не. все отсылает к структуре FILETIME а вней верхнее и нижнее значение какоето. 
PM MAIL   Вверх
Lazin
Дата 29.10.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Код

typedef struct _FILETIME {  DWORD dwLowDateTime;  DWORD dwHighDateTime;
} FILETIME, 

Эта структура то-же 64 - бита, короче тот-же LARGE_INTEGER или long.
Код

long ftime;
****
filetime.dwLowDateTime = (DWORD)ftime;
filetime.dwHighDateTime= (DWORD)ftime >> 32; 

PM MAIL Skype GTalk   Вверх
mrbrooks
Дата 29.10.2007, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



А на 32 разряда смещать обязательно?
PM MAIL   Вверх
Ivan.
Дата 30.10.2007, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



У меня есть класс TLongDT, каторый содержит поле long - количество секунд от 01.01.2000. данного поля хватает на 100 лет, что приемлемо для ведения журнала какого либо процесса.
Этот класс имеет размер всего 4 байта и вполне удобен для работы не прибегая к дробным числам.
Я написал такой класс для быстрой работы с временем, применим для реализации в микроконтроллерах, где применение дробных чисел крайне не желательно.
Строить структуру типа:
Код

struct {
    unsigned Sec:5;    // каждая вторая секунда, чтобы влести в 32 бита.
    unsigned Min:6;
    unsigned Hour:5;
    unsigned Date:5;
    unsigned Month:4;
    unsigned Year:7;
};

можно, но с ней не удобно производить арифметические действия.
Код

class TLongDT
{
protected:
    union {
        u32 Clock;
        struct {
            u8 Clock0, Clock1, Clock2, Clock3;
        };
    };
public:
    static const u16 MONTH[12];
    TLongDT() { Clock = 0; }
    TLongDT(const TLongDT& DT) { Clock = DT.Clock; }
    TLongDT(const u32 Sec) { Clock = Sec; }
    TLongDT(uint Year, uint Month, uint Date);
    TLongDT(uint Hour, uint Min, uint Sec, uint);
    //---------------------------------------------------------------------------
    operator u32() const { return Clock; }
    //---------------------------------------------------------------------------
    TLongDT operator - () const { return TLongDT(-Clock); }
    //---------------------------------------------------------------------------
    TLongDT& operator =(const TLongDT &DT) { Clock = DT.Clock; return *this; }
    TLongDT& operator =(const u32 Sec) { Clock = Sec; return *this; }
    //---------------------------------------------------------------------------
    TLongDT& operator +=(const TLongDT& DT) { Clock += DT.Clock; return *this; }
    TLongDT& operator +=(const u32 Sec) { Clock += Sec; return *this; }
    //---------------------------------------------------------------------------
    TLongDT& operator -=(const TLongDT& DT) { Clock -= DT.Clock; return *this; }
    TLongDT& operator -=(const u32 Sec) { Clock -= Sec; return *this; }
    //---------------------------------------------------------------------------
    TLongDT& operator ++() { Clock++; return *this; }
    TLongDT  operator ++(int) { TLongDT Res(*this); Clock++; return Res; }
    TLongDT& operator --() { Clock--; return *this; }
    TLongDT  operator --(int) { TLongDT Res(*this); Clock--; return Res; }
    //---------------------------------------------------------------------------
    TLongDT operator - (const TLongDT& DT) const { return TLongDT(Clock - DT.Clock); }
    TLongDT operator - (u32 Sec) const { return TLongDT(Clock - Sec); }
    TLongDT operator + (const TLongDT& DT) const { return TLongDT(Clock + DT.Clock); }
    TLongDT operator + (u32 Sec) const { return TLongDT(Clock + Sec); }
    //---------------------------------------------------------------------------
    bool operator ==(const TLongDT& DT) const { return Clock == DT.Clock; }
    bool operator !=(const TLongDT& DT) const { return Clock != DT.Clock; }
    bool operator > (const TLongDT& DT) const { return Clock > DT.Clock; }
    bool operator < (const TLongDT& DT) const { return Clock < DT.Clock; }
    bool operator >=(const TLongDT& DT) const { return Clock >= DT.Clock; }
    bool operator <=(const TLongDT& DT) const { return Clock <= DT.Clock; }
    //---------------------------------------------------------------------------
    uint Sec() const { return Clock % 60; }
    uint Min() const { return (Clock / 60) % 60; }
    uint Hour() const { return (Clock / 3600) % 24; }
    void DecodeDate(uint *Year, uint *Month, uint *Date) const;
    void DecodeTime(uint *Hour, uint *Min, uint *Sec) const;
    uint Date() const { uint Year, Month, Date; DecodeDate(&Year, &Month, &Date); return Date; }
    uint Month() const { uint Year, Month, Date; DecodeDate(&Year, &Month, &Date); return Month; }
    uint Year() const { uint Year, Month, Date; DecodeDate(&Year, &Month, &Date); return Year; }
    uint Day() const { return ((Clock / 86400 + 5) % 7) + 1; }
    inline bool ifDays() { return (Clock3 & 0xC0) == 0xC0; }
    inline u8 Days() { return Clock2 >> 1; }
    inline void Days(u8 Value) { Clock2 = (Clock2 & 0x01) | Value << 1; }
};

Если надо, я выложу исходник.
В даном случаи этот класс еще может хранить и дни недели вместо даты, это необходимо для реализации будильника, срабатывающего либо в конкретную дату или в различные дни недели.


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
mrbrooks
Дата 30.10.2007, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



На счет исходника был бы очень признателен  smile 
PM MAIL   Вверх
Ivan.
Дата 30.10.2007, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Исходник занимает еще меньше чем декларация:
Код

const u16 PROGMEM TLongDT::MONTH[12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; // Количество дней с нового года.
//---------------------------------------------------------------------------
TLongDT::TLongDT(uint Year, uint Month, uint Date){
    if (Month == 0 || Month > 12 || Date == 0 || Year > 100)
        Clock = 0;
    else {
        Clock = Year * 365 + ((Year + 3) >> 2) + pgm_read_word(&MONTH[Month - 1]) + Date;
        if ((Year & 3) || (Month <= 2))
            Clock--;
        Clock *= 86400;
    }
}
//---------------------------------------------------------------------------
TLongDT::TLongDT(uint Hour, uint Min, uint Sec, uint)
{
    Clock = ((u32)Hour * 60 + Min) * 60 + Sec;
}
//---------------------------------------------------------------------------
void TLongDT::DecodeDate(uint *Year, uint *Month, uint *Date) const
{
    uint date = Clock / 86400;
    uint year = date / 365;
    date -= year * 365 + ((year + 3) >> 2);
    uint month = 0;
    while (date >= pgm_read_word(&MONTH[month])) month++;
    date -= pgm_read_word(&MONTH[--month]);
    if ((year & 3) == 0){
        if (month > 1)
            if (date)
                date--;
            else {
                date += pgm_read_word(&MONTH[month]);
                date -= pgm_read_word(&MONTH[--month]);
            }
    }
    *Year = year;
    *Month = month + 1;
    *Date = date + 1;
}
//---------------------------------------------------------------------------
void TLongDT::DecodeTime(uint *Hour, uint *Min, uint *Sec) const
{
    u32 sec = Clock;
    *Sec = sec % 60;
    sec /= 60;
    *Min = sec % 60;
    sec /= 60;
    *Hour = sec % 24;
}
//---------------------------------------------------------------------------

PROGMEM это аттрибут, размещающий данные в области кода (убери его, это конкретно для МК).
pgm_read_word это макрос, читающий данные из области кода (замени его на элементарные операторы =)
    pgm_read_word(&MONTH[Month])  => MONTH[Month]

Незачто! smile

Добавлено через 5 минут и 5 секунд
Кстати, здесь нет проверки с днянедельным форматом, тоесть: DT(в формате yy.mm.dd hh:mm:ss) == DT2(в формате FLAG Пн,Вт,Ср... hh:mm:ss).
Днянедельный формат я придумал позже и еще полностью его не реализовал.


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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