Строка из 13 символов для номера

У меня есть 13-значная строка, которая составляет миллисекунды с 01.01.1970. Мне нужно преобразовать его в дату и время. Первый шаг к этому — преобразовать его в пригодный для использования числовой формат. При 13 символах это выходит за пределы ulong и long, которые имеют максимум 10 цифр. Я смотрю на преобразования int64. Как лучше всего преобразовать этого зверя в числовой формат? Я использую С++ на платформе Windows

Пример "1382507187943" --> число? -- > дата/время?

Спасибо!

ЧАСТЬ 2

Спасибо вам, ребята! Я использую родной С++. Спасибо плакату 2 за код.

Я попробовал это, и это сработало, где str содержит число и является std::string:

__int64 u = _atoi64( str.c_str() );

ЧАСТЬ 3

На самом деле, 13-значное число не помещается в strtoul. Я сделал это и получил правильную строку.

__int64 u = _atoi64( str.c_str() );

time_t c;
//c = strtoul( "1382507187943", NULL, 0 );
c = u;
time(&c);
std::string s = ctime( &c );

person user2913447    schedule 25.10.2013    source источник
comment
Вместо того, чтобы говорить, что я использую С++, спрятанный в вашем тексте, добавьте тег к своему вопросу, где люди могут его увидеть, и чтобы система тегов здесь могла использовать его, когда люди будут искать позже. Вы поняли, как использовать остальные три тега, верно?   -  person Ken White    schedule 25.10.2013
comment
Зачем вам когда-либо получать время в такой строке? Компьютер уже имеет текущее время (в секундах с 01.01.1970) в виде целого числа!   -  person Walter    schedule 25.10.2013
comment
Есть время ожидания полезного ответа. Я использовал смесь своего ответа и ответа плаката 2, а затем плакат 3 предложил хороший ответ. Как вы это отмечаете?   -  person user2913447    schedule 25.10.2013
comment
Я не знаю, почему они посылают это время таким образом. MS полезны, но есть и другие способы их отправки. Я просто должен работать с тем, что у меня есть.   -  person user2913447    schedule 25.10.2013


Ответы (3)


Либо используйте strtull(), либо отрежьте миллисекунды самостоятельно.

unsigned long long tms = strtoull("1382507187943", 10, 0);
time_t rawtime = tms/1000;
unsigned ms = tms%1000;

or

char buf[] = "1382507187943";
unsigned ms = strtoul(&buf[10], 10, 0);
buf[10] = '\0';
time_t rawtime = strtoul(buf, 10, 0);

потом

struct tm * timeinfo;
time (&rawtime);
timeinfo = localtime (&rawtime);    
person chux - Reinstate Monica    schedule 25.10.2013
comment
Примечание. Поскольку time_t обычно является значением со знаком, вероятно, лучше использовать signed long long и т. д. - person chux - Reinstate Monica; 25.10.2013

Если вы используете язык, который не имеет встроенной поддержки арифметики произвольной точности, вам нужно будет добавить такую ​​поддержку. Такая библиотека, как GMP, предоставляет API для таких вычислений. Вполне вероятно, что для вашего языка существует реализация или привязка, если он популярен.

Некоторое время назад я создал связку для GMP на C# и почти уверен, что она будет делать то, что вы хотите.

Однако трудно ответить на этот вопрос, не зная, на каком языке вы говорите.

person Michael J. Gray    schedule 25.10.2013

time_t c;
c = strtoul( "1382507187943", NULL, 0 );
ctime( &c );

решение было взято из здесь

person aah134    schedule 25.10.2013