2015-05-20 2 views
0

В транзакционном сообщении мне нужно отправить дату и время с клиента на сервер. поэтому какой тип данных будет наиболее подходящим.Какой тип данных наиболее подходит для datetime в транзакционной связи в C++?

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

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

+0

i64 звучит хорошо, может быть, вы его конвертируете на серверной стороне? – Hcorg

+0

Являются ли байты в порядке? Может быть, случайно это проблема. – luk32

+0

Как насчет использования 'volatile', поскольку он имеет какое-то отношение ко времени. –

ответ

1

Я думаю, что комментарий Конрада, вероятно, точный короткий ответ, вы должны убедиться, что 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#.

+0

Правильный сэр ... Он работал .. Спасибо –

Смежные вопросы