В бережливом общении мне нужно отправить дату и время от клиента к серверу. так, какой тип данных будет наиболее подходящим.
Мой клиент на C ++, а сервер на C-Sharp. и в сервере я использую ключевое слово DateTime для выполнения этой задачи. но смущен тем, что Cpp то, что я должен использовать, потому что I64, который я использую сейчас, не дает мне правильные данные на стороне сервера.
Заранее спасибо
Я думаю, что комментарий Конрада, вероятно, является точным кратким ответом, вам нужно убедиться, что C ++ i64 имеет то же значение, что и C # i64. .Net DateTime использует счетчик тиков Windows (интервал 100 нс с 1601). Ваш код C ++ может ожидать секунд с 1970 года. Читайте дальше …
Межплатформенная дата / время представляет несколько проблем. Существует множество системных интерфейсов, различные средства языка программирования и различные способы кодирования даты / времени. В большинстве случаев системы и языки не пытаются обеспечить совместимость друг с другом.
Чтобы понять диапазон возможностей:
Если вы хотите иметь дело с датами и временем на разных платформах, может быть полезно выбрать «сводный формат», формат, на который опирается весь ваш код при внешнем сообщении даты / времени (например, с Apache Thrift).
Преобразование в / из сводного формата (или любого другого определенного формата) — это то, что вам нужно делать активно. Любые две системы редко предоставляют совместимые структуры и семантику.
Например, POSIX и Windows выдают 64-битное целое число, в котором хранится прошедшее время с эпохи, но гранулярность (единицы времени) и эпоха (начальная точка) различны. Windows GetSystemTimeAsFileTime () возвращает FILETIME, хранящий 64-битное число 100-наносекундных интервалов с полуночи 1 января 1601 года, а функция POSIX time () возвращает количество секунд, прошедших с 1 января 1970 года. Также некоторые системы определяют поля которые превышают их гранулярность часов. Windows GetSystemTime () сообщает значения в миллисекундах, но обычно с точностью до 10 миллисекунд. Добавьте к этому часовые пояса, високосные секунды и другие аномалии, и вы действительно получите флаер, если просто скопируете биты из одной структуры в другую или переосмыслите указатель без тщательного рассмотрения источника и места назначения.
Явная структура часто более ясна, чем неявное интегральное значение прошедшей единицы / эпохи для общего назначения данных стиля отметки времени. Например, что-то вроде этого может работать для приложения Thrift 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 #.