Russian Qt Forum
Ноябрь 26, 2024, 14:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Convert Unix timestamp to Readable Date/time  (Прочитано 13331 раз)
NicK
Гость
« : Ноябрь 25, 2009, 17:34 »

Есть строка в формате unix time, например: 1246012546357
Каким образом мне получить из нее нормальную дату?
Записан
Rcus
Гость
« Ответ #1 : Ноябрь 25, 2009, 17:38 »

time_t же, соответственно и искать в справке его надо QDateTime QDateTime::fromTime_t ( uint seconds )   [static]
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #2 : Ноябрь 25, 2009, 18:07 »

Для справки:
в Юниксах время измеряется в секундах от 1 января 1970г 0часов 0мин 0сек
Записан

Юра.
NicK
Гость
« Ответ #3 : Ноябрь 25, 2009, 18:22 »

Пытаюсь парсить логи Openfire, где дата каждого сообщения выглядит не стандартным 10-символьным числом unixtime, а 13-символьным.

Пытался вот так делать:
Код:
#include <QtCore>
#include <QtDebug>
 
int main(){
  uint x = 1194278852;
  qDebug() << QDateTime::fromTime_t(x);
  return 0;
}
И вот результат:
Цитировать
QDateTime("pon. lis 5 17:07:32 2007")
Все нормально работает, но если вместо числа 1194278852, указанного в примере, задать нужное мне значение 1246012546357
то получим это:
Цитировать
ошибка: целая константа слишком велика для типа ‘long’
предупреждение: неявное приведение большого целого значения к беззнаковому типу

Т.к. нужное мне число 1246012546357 больше, чеммодет в себя вместить тип uint.

онлайн конвертер (http://www.onlineconversion.com/unix_time.htm) преобразует мои числа нормально. как это сделать мне?
« Последнее редактирование: Ноябрь 25, 2009, 18:45 от NicK » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #4 : Ноябрь 25, 2009, 18:51 »

онлайн конвертер (http://www.onlineconversion.com/unix_time.htm) преобразует мои числа нормально. как это сделать мне?

Wed, 26 Jul 41454 12:12:37 GMT?

Смеющийся Смеющийся

Возможно это в миллисекундах, соответственно делить на 1000, и тогда получится уже что-то вменяемое:

Fri, 26 Jun 2009 10:35:46 GMT
Записан
NicK
Гость
« Ответ #5 : Ноябрь 27, 2009, 01:52 »

Цитировать
Возможно это в миллисекундах, соответственно делить на 1000, и тогда получится уже что-то вменяемое:

Fri, 26 Jun 2009 10:35:46 GMT
Да, действительно, это миллисекунды.

Сделал такую штуку и подсунул то самое 13 символьное число в формате time_t:
Код:
    QDateTime unixtime2datetime(QString strUnixDate)
    {
        return QDateTime::fromTime_t(strUnixDate.toLongLong()/1000);
    }

qDebug()<<unixtime2datetime("1246012546357");

В итоге получаю:
QDateTime("Пт июня 26 14:35:46 2009")

Т.е. все, как  надо, спасибо :-)


А как сделать обратное преобразование QDateTime в этот 13 символьный time_t?
Пробовал QDateTime::toTime_t(), но так выводится только 10 цифр, видимо, без учета миллисекунд. :-(
Записан
spectre71
Гость
« Ответ #6 : Ноябрь 27, 2009, 02:05 »

Цитировать
Возможно это в миллисекундах, соответственно делить на 1000, и тогда получится уже что-то вменяемое:

Fri, 26 Jun 2009 10:35:46 GMT
Да, действительно, это миллисекунды.

Сделал такую штуку и подсунул то самое 13 символьное число в формате time_t:
Код:
    QDateTime unixtime2datetime(QString strUnixDate)
    {
        return QDateTime::fromTime_t(strUnixDate.toLongLong()/1000);
    }

qDebug()<<unixtime2datetime("1246012546357");

В итоге получаю:
QDateTime("Пт июня 26 14:35:46 2009")

Т.е. все, как  надо, спасибо :-)


А как сделать обратное преобразование QDateTime в этот 13 символьный time_t?
Пробовал QDateTime::toTime_t(), но так выводится только 10 цифр, видимо, без учета миллисекунд. :-(



Код
C++ (Qt)
   QDateTime unixtime2datetime(QString strUnixDate)
   {
       QDateTime dt(QDateTime::fromTime_t(strUnixDate.toLongLong()/1000));
       dt.addMSecs(strUnixDate.toLongLong()%1000);
       return dt;
   }

uint QDateTime::toTime_t ()  - секунды
QDateTime::time ()::msec() -  милисекунды

Вроде так
Записан
Zmeishe
Гость
« Ответ #7 : Ноябрь 27, 2009, 10:13 »

Возможно это в миллисекундах, соответственно делить на 1000, и тогда получится уже что-то вменяемое:

Я бы не стал делить на 1000. Лучше умножить на 0.001

Однажды напоролся на такие грабли - полдня в ступоре был.
Теперь, если есть возможность деление заменить умножением, лучше умножить. И тогда получится ещё более вменяемое.
« Последнее редактирование: Ноябрь 27, 2009, 10:15 от Zmeishe » Записан
spectre71
Гость
« Ответ #8 : Ноябрь 27, 2009, 10:31 »

Возможно это в миллисекундах, соответственно делить на 1000, и тогда получится уже что-то вменяемое:

Я бы не стал делить на 1000. Лучше умножить на 0.001

Однажды напоролся на такие грабли - полдня в ступоре был.
Теперь, если есть возможность деление заменить умножением, лучше умножить. И тогда получится ещё более вменяемое.

Возможно у тебя и были какие-то грабли, но это не значит что в данном случае ты прав.

Однозначно делить но 1000!
Записан
Zmeishe
Гость
« Ответ #9 : Ноябрь 27, 2009, 10:50 »

Грабли очень простые
В штриховом коде сумма в копейках 7240
При делении на 100 получалось 72.39999999, а при умножении на 0.01 получалось 72.40
На экране во вьюхе обе суммы выглядели одинаково, но в памяти они были разными.
Записан
spectre71
Гость
« Ответ #10 : Ноябрь 27, 2009, 10:54 »

Грабли очень простые
В штриховом коде сумма в копейках 7240
При делении на 100 получалось 72.39999999, а при умножении на 0.01 получалось 72.40
На экране во вьюхе обе суммы выглядели одинаково, но в памяти они были разными.


Ты видишь что здесь целочисленная арифметика.
А с ней как правило ситуация с точностью до наоброт - уж поверь.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.072 секунд. Запросов: 22.