Версия для печати темы
Форум на CrossPlatform.RU _ Qt Общие вопросы _ Преобразовать int64 в QDate
Автор: iddqd 20.7.2010, 9:36
Есть дата, хранящаяся в микросекундах в виде int64.
Как правильнее и быстрее преобразовать её в QDate/QDateTime ?
Пробовал QDateTime::addMSecs(), не это не то, так как результат в дебаггере показывает 1531 год
Автор: maint 20.7.2010, 14:04
Цитата(iddqd @ 20.7.2010, 15:36)
Есть дата, хранящаяся в микросекундах в виде int64.
Как правильнее и быстрее преобразовать её в QDate/QDateTime ?
Пробовал QDateTime::addMSecs(), не это не то, так как результат в дебаггере показывает 1531 год
по моему так
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)