2015-05-20 69 views
0

在節儉通信中,我需要從客戶端向服務器發送日期和時間。所以哪種數據類型最合適。哪種數據類型最適合於在C++中進行節儉通信的日期時間?

我的客戶端使用C++,服務器使用C-Sharp。並在服務器中我使用DateTime關鍵字來完成此任務。但是對Cpp感到困惑,因爲我現在使用的I64並沒有在服務器端給我提供正確的數據,所以我應該使用它。

由於提前

+0

i64聽起來不錯,也許你把它轉換成服務器端不合適? – Hcorg

+0

字節是否正常?也許偶然的問題是endianess。 – luk32

+0

如何使用'volatile',因爲它與時間有關。 –

回答

1

我認爲康拉德的評論可能是準確的答案很簡單,你需要確保的是,C++ I64的含義爲C#I64相同。 .Net DateTime使用Windows滴答計數(自1601年起100納秒的時間間隔)。您的C++代碼可能預計自1970年以來。閱讀...

跨平臺日期/時間提出了幾個挑戰。有許多系統界面,獨特的編程語言設施和各種編碼日期/時間的方式。在大多數情況下,系統和語言不會嘗試提供彼此的兼容性。

爲了得到一個意義的可能性的範圍:

  • 的GNU Linux支持timeval結構(微秒分辨率),結構的timespec(納秒的分辨率),time_t的(第二分辨率),結構TM(日期/時間破down)等等,更多信息在這裏: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提供了std ::時辰庫
  • 的.Net提供的日期時間結構和其他功能

如果你要處理的日期並跨平臺時,選擇「數據透視格式」是一種有用的格式,這種格式在外部(例如,使用Apache Thrift)進行日期/時間通信時依賴於所有代碼。

轉換成數據透視格式(或任何其他特定格式)是您需要主動執行的操作。任何兩個系統都提供兼容的結構和語義是不常見的。例如,POSIX和Windows都產生一個64位的整數,它包含了自紀元以來經過的時間,但粒度(時間單位)和時期(起始點)是不同的。 Windows GetSystemTimeAsFileTime()返回一個FILETIME,它自1601年1月1日午夜開始存儲64位數的100納秒間隔,POSIX time()函數返回自1970年1月1日以來已經過的秒數。還有一些系統定義了字段超過了他們的時鐘粒度。 Windows GetSystemTime()將值報告爲毫秒,但通常精確到只有大約10毫秒。添加到這個時區,閏秒和其他異常,如果您只是將一個結構中的位複製到另一個結構或者重新解釋指針而沒有仔細考慮源和目的地,那麼您確實正在使用傳單。

對於時間戳記樣式數據的通用通信,顯式結構通常比隱式流逝單位/時代整數值更清晰。例如,這樣的事情可能工作爲節儉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++代碼將可以訪問與C#服務器相同的mscorlib.DateTime。

+0

正確的先生...它的工作..謝謝 –

相關問題