crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> FILETIME (Windows), Как перевести FILETIME в строку ?
flankerr
  опции профиля:
сообщение 12.5.2008, 10:47
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 9.1.2008
Пользователь №: 65

Спасибо сказали: 2 раз(а)




Репутация:   0  


Есть переменная которая содержит виндушный FILETIME как из него в QT получить год\месяц\день и тп.. по отдельности ?:)
разумеется БЕЗ использования виндушных функций.

Сообщение отредактировал flankerr - 12.5.2008, 10:49
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 12.5.2008, 12:42
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Так:
#include <QtCore/QCoreApplication>

#include <windows.h>
#include <QDateTime>


const QString getDateTime( QDateTime &rdt)
{
    struct timeval p;

    union
    {
        long long ns100; /*time since 1 Jan 1601 in 100ns units */
        FILETIME ft;
    }now;

    GetSystemTimeAsFileTime( &(now.ft) );
    p.tv_usec=(long)((now.ns100 / 10LL) % 1000000LL );
    p.tv_sec= (long)((now.ns100-(116444736000000000LL))/10000000LL);

    rdt.setTime_t( p.tv_sec);

    return rdt.toString();
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QDateTime dt;
    qDebug( "%s", qPrintable( getDateTime( dt)));
    
    return a.exec();
}
С Andrew Selivanov сейчас родили... :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flankerr
  опции профиля:
сообщение 12.5.2008, 13:39
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 9.1.2008
Пользователь №: 65

Спасибо сказали: 2 раз(а)




Репутация:   0  


Цитата(ViGOur @ 12.5.2008, 13:42) *
С Andrew Selivanov сейчас родили... :)

зачем struct timeval p;
?

всё в двух строчках

QDateTime qTime;
qTime.setTime_t((FILETIME - 116444736000000000)/ 10000000);


правда на сколько понял условную компиляци. всё равyо придёться делать

#ifdef WIN32
static UINT64 ui64Shift = 116444736000000000;
#else
static UINT64 ui64Shift = 116444736000000000LL;
#endif

Цитата(ViGOur @ 12.5.2008, 14:23) *
Это стандартный хидер для работы с виндовым API...

Но чтоб его получить надо установить Студию.
а Litkevich Yuriy спрашивал именно где взять

Сообщение отредактировал flankerr - 12.5.2008, 13:36
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 12.5.2008, 13:59
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(flankerr @ 12.5.2008, 14:39) *
зачем struct timeval p;
?
всё в двух строчках
Чисто для для примера... ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 12.5.2008, 14:02
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


По поводу условной компиляции - в данном случае, зависимость не от системы а от компилятора. Поэтому лучше писать так:
static const quint64 ui64Shift = Q_UINT64_C(116444736000000000);


Сообщение отредактировал Litkevich Yuriy - 12.5.2008, 14:40
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.5.2008, 14:38
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


тему разделил файл windows.h, он с кем должен идти?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrew Selivanov
  опции профиля:
сообщение 12.5.2008, 15:23
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


Цитата(Tonal @ 12.5.2008, 15:02) *
По поводу условной компиляции - в данном случае, зависимость не от системы а от компилятора. Поэтому лучше писать так:
static const quint64 ui64Shift = Q_UINT64_C(116444736000000000);

Раз пошла такая пьянка... :)
1) А static то тут зачем?
2) Каждую переменную обвязывать дефайнами грустно, проще сделать один раз:
#  ifndef _MSC_VER
#    define ULL(number)   number ## ULL
#    define LL(number)   number ## LL
#  else   // if defined (_MSC_VER)
     // MSVC 7.0 doesn't recognize the LL suffix
#    define ULL(number)   number ## UI64
#    define LL(number)   number ## I64
#  endif   // _MSC_VER


Сообщение отредактировал Andrew Selivanov - 12.5.2008, 15:24
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 12.5.2008, 16:32
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


static можно ставить а можно и не ставить - зависит от того, где объявляется константа.

А насчёт приведённого дефайна - оно уже есть в Qt - Q_INT64_C, Q_UINT64_C - лучше их использовать, чем свои велосипеды рисовать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.11.2024, 2:30