Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Преобразовать int64 в QDate

Автор: iddqd 20.7.2010, 9:36

Есть дата, хранящаяся в микросекундах в виде int64.
Как правильнее и быстрее преобразовать её в QDate/QDateTime ?
Пробовал QDateTime::addMSecs(), не это не то, так как результат в дебаггере показывает 1531 год :blink:

Автор: maint 20.7.2010, 14:04

Цитата(iddqd @ 20.7.2010, 15:36) *
Есть дата, хранящаяся в микросекундах в виде int64.
Как правильнее и быстрее преобразовать её в QDate/QDateTime ?
Пробовал QDateTime::addMSecs(), не это не то, так как результат в дебаггере показывает 1531 год :blink:

по моему так
void QDateTime::setTime_t ( uint seconds )
Sets the date and time given the number of seconds that have passed since 1970-01-01T00:00:00, Coordinated Universal Time (Qt::UTC). On systems that do not support time zones this function will behave as if local time were Qt::UTC.

только округлить до секунд

Автор: Litkevich Yuriy 20.7.2010, 14:06

iddqd, возможно дата в Unix-формате, тогда используй:
http://doc.crossplatform.ru/qt/4.5.0/qdatetime.html#fromTime_t
ну а из него уже получишь только дату

чуток опопздал :)

Автор: iddqd 20.7.2010, 14:13

Дата может быть как до 1970, так и после 1970 года. Так что эти функции не помогают...

Автор: Litkevich Yuriy 20.7.2010, 14:41

Цитата(iddqd @ 20.7.2010, 18:13) *
Дата может быть как до 1970, так и после 1970 года.
ну скажи, как у тебя дата представлена, что собой представляет единица (секунду, час, с каким смещением, ...).
в виде int64 можно хранить какую угодно информацию.

Автор: iddqd 20.7.2010, 14:43

qint64 представляет из себя "a number of microseconds since midnight, January 1st, 0 AD nominal Gregorian.".

Автор: SABROG 21.7.2010, 10:56

Цитата(iddqd @ 20.7.2010, 15:43) *
AD


AD - Anno Domini (lat), От Рождества Христова

Цитата(iddqd @ 20.7.2010, 10:36) *
Пробовал QDateTime::addMSecs()

Этот метод добавляет миллисекунды, а не микросекунды. 1 миллисекунда = 1000 микросекунд. QDateTime работает от 1970 года, а не от Рождества Христова. Приведи полное значение числа на форуме.

Автор: iddqd 21.7.2010, 11:40

qint64 равно 61855747200000000

в бинарном виде в файле:

00 20 2C 6F 79 C1 DB


читаю как
QFile file("file.dat");
file.open(QIODevice::ReadOnly);
QDataStream in(&file);
in.setByteOrder(QDataStream::LittleEndian);

qint64 b64;
in >> b64;

Автор: SABROG 21.7.2010, 15:49

Цитата(iddqd @ 21.7.2010, 12:40) *
61855747200000000


1956 год должен получиться или ты результат не можешь проверить?

Автор: iddqd 21.7.2010, 16:01

SABROG, год должен получиться 1960-й

Автор: SABROG 21.7.2010, 17:43

Цитата(iddqd @ 21.7.2010, 17:01) *
SABROG, год должен получиться 1960-й

Правильно, чуток не верно посчитал:

61855747200000000 / 1000 = 61855747200000 // переводим в миллисекунды
61855747200000 / 1000 = 61855747200  // переводим в секунды

365.2424 * 24 * 60 * 60 = 31556943.36 // вычисляем количество секунд в году Грегорианского календаря

61855747200 / 31556943.36 = 1960.1 // получаем количество лет
4,13821440 - остаток 4 секунды.


То есть судя по маленькому остатку у тебя в базе почти ровная дата 01-01-1960 00:00:04

Ты под Symbian пишешь?

Автор: iddqd 28.7.2010, 20:34

Цитата(SABROG @ 21.7.2010, 18:43) *
Ты под Symbian пишешь?


Нет, под десктоп, но вот формат данных совпадает с TTime из Symbian C++.

Дата должна получиться - 06.02.1960

PS: тему оказывается разделили, а уведомлений никаких не пришло...

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)