2011-06-09 42 views
2

當我使用DataContractJsonSerializer將當前時間序列化爲DateTime時,我得到以下1307654074638-0500如何格式化DateTime結構以使其與DataContractJsonSerializer使用的格式相匹配?

我想生成我自己的JSON,可以通過DataContractJsonSerializer進行反序列化,但我無法弄清楚如何生成具有相同格式的DateTime

我相信它使用自紀元以來的毫秒數,因爲它是基數,但我總是收到大約6小時關閉的數字。我相信這與時區有關(我在中部時區),這是有道理的。

var myDate = DateTime.Now; 
var epoch = new DateTime(1970, 01, 01, 01, 0, 0); 
var serializer = new DataContractJsonSerializer(typeof (DateTime)); 
var ms = new MemoryStream(); 
serializer.WriteObject(ms, myDate); 
Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray())); 
Console.WriteLine((myDate.AddTicks(-epoch.Ticks)).Ticks/10000); 

輸出

"\/Date(1307654587318-0500)\/" 
1307632987318 

或爲方便比較

1307654587318-0500 
1307632987318 
+0

是序列化問題還是你沒有使用DateTime.UtcNow? – 2011-06-09 21:28:39

+0

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.idatacontractsurrogate.getobjecttoserialize.aspx? – 2011-06-09 21:30:05

+0

即使我使用UtcNow,它仍然關閉。 – ScArcher2 2011-06-09 21:34:12

回答

1

我建議你使用DataContractJsonSerializer類在您需要的格式獲取數據。如果做不到這一點,你可以做一些沿着這些路線:

using System; 
using System.Globalization; 
using System.IO; 
using System.Runtime.Serialization.Json; 
using System.Text; 

namespace SO6299496 
{ 
    class Program 
    { 
     static void Main() 
     { 
      var myDate = DateTime.Now;     
      var serializer = new DataContractJsonSerializer(typeof(DateTime)); 
      var ms = new MemoryStream(); 
      serializer.WriteObject(ms, myDate); 
      Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray())); 
      Console.WriteLine(SerializeDate(myDate)); 

     } 


     static string SerializeDate(DateTime value) 
     { 
      var epoch = new DateTime(1970, 01, 01, 01, 0, 0); 

      long date = (value.ToUniversalTime().Ticks - epoch.Ticks)/10000; 
      string sign = ""; 
      string offset = ""; 

      if (value.Kind == DateTimeKind.Unspecified || value.Kind == DateTimeKind.Local) 
      { 
        TimeSpan utcOffset = TimeZone.CurrentTimeZone.GetUtcOffset(value.ToLocalTime()); 
        sign = utcOffset.Ticks >= 0L ? "+" : "-"; 
        int offsetHours = Math.Abs(utcOffset.Hours); 
        int offsetMinutes = Math.Abs(utcOffset.Minutes); 
        offset = (offsetHours < 10) ? ("0" + offsetHours) : offsetHours.ToString(CultureInfo.InvariantCulture); 
        offset += (offsetMinutes < 10) ? ("0" + offsetMinutes) : offsetMinutes.ToString(CultureInfo.InvariantCulture); 
      } 

      return date + sign + offset; 
     } 
    } 
} 

但我想再次重申,你最好使用DataContractJsonSerializer。爲什麼要發明已經發明的東西?

+0

我不斷嘗試格式化日期。 DataContractJsonSerializer對此很好。我從來沒有考慮過直接使用它來序列化一個字段。 – ScArcher2 2011-06-10 13:12:31