Я думаю, что комментарий Конрада, вероятно, точный короткий ответ, вы должны убедиться, что C++ i64 имеет тот же смысл, что и C# I64. .Net DateTime использует подсчет тиков Windows (100 секунд с интервалом nano с 1601). Ваш код на C++ может ожидать секунды с 1970 года. Читайте дальше ...
Кросс-платформенная Дата/Время представляет несколько проблем. Существует множество системных интерфейсов, различных языков программирования и различные способы кодирования даты и времени. В большинстве случаев системы и языки не пытаются обеспечить совместимость друг с другом.
Чтобы получить чувство для диапазона возможностей:
- Gnu Linux поддерживает структуры формата: первый формат (микросекунды разрешение), структура TimeSpec (нсек разрешение), time_t (второе разрешение), STRUCT тм (дата/время сломанной вниз), среди прочего, больше информации здесь: ftp://ftp.gnu.org/old-gnu/Manuals/glibc-2.2.3/html_chapter/libc_21.html
- Windows использует SYSTEMTIME, FILETIME и LARGE_INTEGER для таймеров с высоким разрешением.
- C++ 98 наследует времени() из C, но C++ 11 предоставляет библиотеку станд :: хроно
- .Net поставляет структуру DateTime и другие функции
Если вы хотите иметь дело с датами и раз на разных платформах может быть полезно выбрать «сводный формат» - формат, который использует весь ваш код при передаче времени/времени извне (например, с Apache Thrift).
Преобразование в/из сводного формата (или любого другого конкретного формата) - это то, что вам нужно делать активно. Для любых двух систем нередко поставляются совместимые структуры и семантика.
Например, POSIX и Windows создают 64-битное целое число, прошедшее с тех пор, как эпоха, но гранулярность (единицы времени) и эпоха (начальная точка) различны. Windows GetSystemTimeAsFileTime() возвращает FILETIME, сохраняя 64-разрядное число 100-наносекундных интервалов с полуночи 1 января 1601 года, а функция времени POSIX() возвращает количество секунд, прошедших с 1 января 1970 года. Также некоторые системы определяют поля которые превышают их часовую детализацию. Windows GetSystemTime() сообщает значения миллисекунде, но, как правило, точность составляет всего около 10 миллисекунд. Добавьте к этому timezones, високосные секунды и другие аномалии, и вы действительно берете флаер, если вы просто копируете биты из одной структуры в другую или переинтерпретируете указатель без тщательного рассмотрения источника и адресата.
Явная структура часто бывает яснее, чем неявное интегральное значение, прошедшее единое целое/эпоха, для обмена данными стиля времени по умолчанию. Например, что-то подобное может работать для приложения Бережливость RPC:
struct TimeStamp {
1: i16 year
2: byte month
3: byte day
4: byte hour=0
5: byte minute=0
6: i16 second=0
7: double fraction=0
}
Если вы хотите быть в состоянии сделать математику с метками времени (например,вычесть две временные метки, чтобы найти прошедшее время), тогда интегральное значение (например, i64) может быть лучше, но вам все равно необходимо будет установить сводный формат и тщательно управлять преобразованиями с платформы на платформу и язык на язык, чтобы как можно более грамотно и эпоксидно ,
Одна из приятных особенностей среды JVM и .Net/CLR заключается в том, что вы можете использовать соответствующие библиотеки платформ с любого языка на платформе. Таким образом, если вы используете управляемый C++, ваш код на C++ будет иметь доступ к тому же mscorlib.DateTime, что и сервер C#.
i64 звучит хорошо, может быть, вы его конвертируете на серверной стороне? – Hcorg
Являются ли байты в порядке? Может быть, случайно это проблема. – luk32
Как насчет использования 'volatile', поскольку он имеет какое-то отношение ко времени. –