Какой тип данных наиболее подходит для datetime в бережливом общении в c ++?

В бережливом общении мне нужно отправить дату и время от клиента к серверу. так, какой тип данных будет наиболее подходящим.

Мой клиент на C ++, а сервер на C-Sharp. и в сервере я использую ключевое слово DateTime для выполнения этой задачи. но смущен тем, что Cpp то, что я должен использовать, потому что I64, который я использую сейчас, не дает мне правильные данные на стороне сервера.

Заранее спасибо

0

Решение

Я думаю, что комментарий Конрада, вероятно, является точным кратким ответом, вам нужно убедиться, что C ++ i64 имеет то же значение, что и C # i64. .Net DateTime использует счетчик тиков Windows (интервал 100 нс с 1601). Ваш код C ++ может ожидать секунд с 1970 года. Читайте дальше …

Межплатформенная дата / время представляет несколько проблем. Существует множество системных интерфейсов, различные средства языка программирования и различные способы кодирования даты / времени. В большинстве случаев системы и языки не пытаются обеспечить совместимость друг с другом.

Чтобы понять диапазон возможностей:

  • Gnu Linux поддерживает struct timeval (разрешение usec), struct timepec (разрешение nsec), time_t (второе разрешение), struct tm (дата / время с разбивкой), среди прочего, дополнительную информацию здесь: ftp://ftp.gnu.org/old-gnu/Manuals/glibc-2.2.3/html_chapter/libc_21.html
  • Windows использует SYSTEMTIME, FILETIME и LARGE_INTEGER для таймеров с высоким разрешением.
  • C ++ 98 наследует time () от C, но C ++ 11 предоставляет библиотеку std :: chrono
  • .Net предоставляет структуру DateTime и другие функции

Если вы хотите иметь дело с датами и временем на разных платформах, может быть полезно выбрать «сводный формат», формат, на который опирается весь ваш код при внешнем сообщении даты / времени (например, с 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 #.

1

Другие решения


По вопросам рекламы [email protected]