2016-10-20 8 views
-1

我需要將事件時間存儲在Azure表存儲中。那個時間必須在用戶當地時間,而不是UTC ......真的。 [數據被查詢爲「查找週六發生在(用戶)上的所有購買行爲」。顯然,「星期六」代表了全球用戶的大範圍時間,而且我無法通過每個用戶分別按時區查詢]。無法將DateTime反序列化爲使用JsonSerializer的本地時間

數據來自Json的Event Hub。 date屬性是DateTime,它在客戶端上設置爲DateTime.Now(發送到Event Hub)。我在兩端都使用了Newtonsoft JsonSerializer。反序列化時,我似乎無法在本地時間獲取日期。我已經試過各種形式的:

JsonSerializer jsDeserializer = new JsonSerializer(); 
jsDeserializer.DateTimeZoneHandling = DateTimeZoneHandling.Local; 

我認爲這是最好的,如果該時區信息得到剝離出來,它好像它是一個常見的問題不夠和有足夠的性能來JsonSerializer處理呢......但到目前爲止沒有運氣。我需要寫一個自定義轉換器嗎?或者我必須將它串聯起來?

對這些意見:

  • 我不想知道或關心的JSON是什麼。如前所述,C# DateTime屬性在客戶端中設置爲DateTime.Now,並調用Json 序列化程序。在服務器上,Json解串器稱爲 ,並返回DateTime屬性。從理論上講,我絕不應該讓 看到實際的Json ......這點很重要。
  • 我不想知道或關心「我的時區」是什麼。在Azure上運行的Event Hub WebJob是 ,所以我甚至不能保證 服務器的時區是什麼。
  • 如果EDT中客戶端上的DateTime.Now的值是5pm,它總是被序列化=>反序列化到晚上9點。爲了查詢目的,它需要在下午5點存儲在數據庫中。
+1

我想問題是缺少樣本json,您的時區,預期的輸出 –

+1

事實上,發佈一個好問題並不複雜。 *我有這個輸入,我寫這個代碼,我得到這個輸出,但期望這* – EZI

回答

0

好了,這裏有幾種方法可以得到它的工作...

1)如果你可以改變客戶端Jsonserializer,該DateTimeZoneHandling.Unspecified屬性添加到JsonSerializerSettings。 2)如果您不能更改客戶端(我不能),則反序列化具有DateTimeOffset類型而不是DateTime類型的對象。從那裏你可以得到原始的本地時間(DateTimeOffset.DateTime)。

 string data = Encoding.UTF8.GetString(eventData.GetBytes()); 
     var jsonSerializerSettings = new JsonSerializerSettings() 
     { 
      DateFormatHandling = DateFormatHandling.IsoDateFormat, 
      DateParseHandling = DateParseHandling.DateTimeOffset, 
      DateTimeZoneHandling = DateTimeZoneHandling.Local, 
     }; 
     List<ObjWithDateTimeOffset> eAcqs = JsonConvert.DeserializeObject<List<ObjWithDateTimeOffset>>(data, jsonSerializerSettings); 
     List<ObjWithDateTime> gAcqs = new List<ObjWithDateTime>(); 
     foreach(ObjWithDateTimeOffset eAcq in eAcqs) 
     { 
      ObjWithDateTime gAcq = new ObjWithDateTime() 
      { 
       AcquisitionType = eAcq.AcquisitionType, 
       Value = eAcq.Value, 
       DateAcquisition = eAcq.DateAcquisition.DateTime, 
      }; 
      gAcqs.Add(gAcq); 
     } 
     return gAcqs; 
相關問題