Как получить время в миллисекундах с начала эпохи от boost :: posix_time :: ptime - PullRequest
5 голосов
/ 11 августа 2011

Я видел некоторые другие ответы на SO , которые предполагают, что мы можем получить время из эпохи в миллисекундах, вычитая время эпохи из «другого» времени, но это не работает, когда я пытаюсь это:

ptime epoch = time_from_string("1970-01-01 00:00:00.000");
ptime other = time_from_string("2011-08-09 17:27:00.000");

long diff = (other-epoch).total_milliseconds();

На этом этапе diff равно -1349172576, и оно должно быть положительным числом, так как «другое» время - 2011. Кто-нибудь знает, что может быть причиной этого? Как правильно получить миллисекунды с эпохи?

Кроме того, я попытался построить объект ptime за миллисекунды:

ptime result = from_time_t(diff);

Результатом становится: «1927-Apr-01 13:50:24», и это должно быть «2011-Aug-09 17: 27: 00.000». В чем тут подвох?

Обновление:

ОК, поэтому моя ошибка связана с тем, что у меня есть 2 программы, одна из которых C # (8 байт / 64-битная длина) и C ++ (4 байт / 32-битная длина); в любом случае, это взаимодействие здесь не изображено.

Однако, когда я использую long long, значение является положительным, но итоговая дата (построенная from_time_t) по-прежнему неверна: «2012-Oct-02 10:09:36».

Ответы [ 3 ]

6 голосов
/ 11 августа 2011

Предположительно, вы находитесь на платформе, на которой long меньше 64 бит.

Давайте предположим, что это 32 бита & ndash; в этом случае максимальное значение long равно 2147483648. Однако это было ~ 1312000000000 миллисекунд с начала эпохи , поэтому long явно недостаточно для удержания этого значения и, следовательно, вы видите переполнение.

Я бы сделал что-то вроде этого:

ptime epoch = time_from_string("1970-01-01 00:00:00.000");
ptime other = time_from_string("2011-08-09 17:27:00.000");

time_duration const diff = other - epoch;
long long ms = diff.total_seconds();
ms *= 1000LL;
ms += diff.fractional_seconds() / 1000000L; // 1000L if you didn't build datetime
                                            // with nanosecond resolution

Создание ptime из указанного количества миллисекунд имеет ту же проблему & ndash; ptime работает в терминах long, и у вас есть long long & ndash; так что вам по сути нужно сделать обратное:

// given long long ms
time_duration t = seconds(static_cast<long>(ms / 1000LL));
if (ms % 1000LL)
    t += milliseconds(static_cast<long>(ms % 1000LL));
4 голосов
/ 02 ноября 2012

Сокращенный вариант отличного решения ildjarn:

ptime epoch = time_from_string("1970-01-01 00:00:00.000");
ptime other = time_from_string("2011-08-09 17:27:00.001");

time_duration const diff = other - epoch;
long long ms = diff.total_milliseconds();

Это не зависит от того, был ли он построен с наносекундным разрешением.

1 голос
/ 11 августа 2011

вы можете попробовать:

ptime other = time_from_string("2011-08-09 17:27:00.000");
time_t posix_time = (other - ptime(min_date_time)).total_seconds();
...