2016-01-20 3 views
-2

У меня есть проект о машинах с GPS. Мне нужно вернуть начало и конечный момент для каждого автомобиля.Преобразование 13 десятичных чисел в datetime

У нас есть:
time_t x, y; Потому что я буду использовать их позже для преобразования.

У меня проблема. Я прочитал из внешних файлов данные в таком формате:

auto1 
1439467747492 
auto1 
1439467748512 

... и т. Д. auto1-> название автомобиля;
1439467747492-> момент времени во время автомобиля

Я попытался получить первую позицию первого момента и последний момент для каждого автомобиля. Это код в C++:

long test = momenti[choice1]/1000; 
time_t x = test; 
cout << "  Momentul initial:\n " << ctime(&x) << endl; 
long test1 = momentf[choice1]/1000; 
time_t y = test1; 
cout << "  Momentul final:\n " << ctime(&y) << endl; 

Получаю ту же дату для каждого автомобиля. Что-то вроде momenti[i]=momentf[i] Что я сделал не так?

+5

Перед тем, как задать вопрос, обязательно просмотрите ваш вопрос и убедитесь, что он отформатирован правильно. – NathanOliver

+1

Обычные советы: скомпилируйте все предупреждения и информацию об отладке ('g ++ -Wall -Wextra -g'), затем ** используйте отладчик ** (' gdb') и [valgrind] (http://valgrind.org/). –

+0

Вы, очевидно, новичок здесь, если считаете, что комментарий был жестоким. На самом деле это было намного добрее, чем многие, которые я видел. –

ответ

1

Это не хорошо. По эпохе преобразователя мы должны получить это: GMT: Чт, 13 августа 2015 12:09:07 GMT

Вот как вы можете получить этот выход с C++ 11/14 и с помощью this free, open source date library, который расширяет C++ <chrono> библиотеки для обработки дат.

#include "date.h" 
#include <chrono> 
#include <iostream> 

int 
main() 
{ 
    using namespace std::chrono; 
    using namespace std; 
    using namespace date; 
    using time_point = std::chrono::time_point<system_clock, milliseconds>; 
    auto tp = time_point{1439467747492ms}; 
    auto dp = floor<days>(tp); 
    auto time = make_time(tp - dp); 
    auto ymd = year_month_day{dp}; 
    cout << "GMT: " << weekday{dp} << ", " << ymd.day() << ' ' << ymd.month() 
     << ' ' << ymd.year() << ' ' << time << " GMT\n"; 
} 

Выход:

GMT: Thu, 13 Aug 2015 12:09:07.492 GMT 

Я бросил в дробных секунд для удовольствия, и это казалось позором тратить их (Lib C не даст их вам). Если вы действительно не хотите их, это легко исправить:

auto time = make_time(floor<seconds>(tp) - dp); 

Теперь выход:

GMT: Thu, 13 Aug 2015 12:09:07 GMT 

Вы должны C++ 14 для выше 1439467747492ms. Если у вас есть только C++ 11, вы можете использовать sub вместо этого: milliseconds{1439467747492}. Если у вас только C++ 03, то вы на 13 лет отстаете от времени и застряли с ctime. ;-)

Решение chrono предложит вам большую безопасность, большую гибкость и большую производительность.

Если я могу исправить и широта и долгота проблема будет велика лол

Если вы можете перевести широту и долготу в имени часовых поясов IANA (и есть инструменты, чтобы сделать это), я у вас есть IANA timezone database parser для вас, который взаимодействует с <chrono> и "date.h".

1
#include <iostream> 
#include <cstring> 
#include <time.h> 
using namespace std; 

int main() 
{ 
    long test = 1439467747492; 
    time_t x = test; 
    cout << ctime(&x) << endl; 
    return 0; 
} 

Производит

Tue Sep 18 20:15:32 1990 
+0

за ваш ответ! Поэтому я проверил, что у меня есть в момент и в момент. Они имеют правильные значения. Но я не знаю, как конвертировать число с 13 цифрами в обычную дату, например, 10.05.2015 21:30. Это проблема. Я использовал ctime, но не делаю для меня ничего подходящего, видимо, –

+0

Можете ли вы посоветовать мне, какую функцию использовать в C++ Visiual Studio2013? –

+0

вы можете проверить сейчас .... –

Смежные вопросы