2012-12-06 25 views
2

我在持久存儲的字段中限制了255個字符。在這255個字符中,我想存儲可以在應用程序中成功反序列化的日期和時間值的最大數量。將他們轉換爲int如提到的here是我唯一的選擇嗎?將日期時間序列化爲最少存儲字符數

+1

多少精做你需要存儲? (秒?毫秒?納秒?時區?)字符串是否需要打印? – SLaks

+0

@SLaks忘記提及..只需要分鐘無需時區信息。不可打印也很好。 – Raghu

+1

你想支持什麼範圍? – SLaks

回答

1

首先,將每個DateTime轉換爲一個儘可能少的字節的整數值(可能取決於您要保留的內容)。
如果你只需要存儲分鐘,3個字節將覆蓋31年,4個字節將覆蓋8,166年。

將這些字節打包到一個字節數組中,然後將該字節數組轉換爲Base64。這將每6個字符存儲一個日期。

或者,選擇非Unicode編碼並將字節數組直接轉換爲字符串。這將每4個不可打印的可打印字符存儲一個日期。

+0

爲什麼要轉換爲Base64? – Jeroen

+0

@Jeroen:在他提到不可印刷性之前,我寫過這樣的文章。 – SLaks

+0

@SLaks我剛剛發佈了一個代碼示例,根據您的建議! – Raghu

0

感謝@SLaks,難道這就是你建議我去了解它(如果我沒有想打印的字符):

 [Test] 
     public void DateTimeTest() 
     { 
      var dateTime = new DateTime(2012, 12, 12, 12, 12, 0); 
      int intDateTime = Int32.Parse(dateTime.ToString("yymmddHHMM", CultureInfo.CurrentCulture)); 
      byte[] bytesDateTime = BitConverter.GetBytes(intDateTime); 
      string base64 = Convert.ToBase64String(bytesDateTime); 

      Debug.WriteLine(base64); // Prints fIA/SA== 

      byte[] newBytesDateTime = Convert.FromBase64String(base64); 
      int newIntDateTime = BitConverter.ToInt32(newBytesDateTime, 0); 
      var newDateTime = DateTime.ParseExact(newIntDateTime.ToString(), "yymmddHHMM", CultureInfo.CurrentCulture); 

      Assert.AreEqual(dateTime, newDateTime); 
     } 
+1

而不是使用字符串解析,您應該存儲自某個固定的基準日期以來的分鐘數。 – SLaks

相關問題