2017-07-05 78 views
1

我正在使用Xamarin.Forms和Azure應用程序服務(包括脫機同步)的應用程序。Azure應用服務 - 在同步期間更改日期時間

在客戶端上有這樣一段代碼:

appointment.StartDate = System.DateTime.Now; 

我們假設appointment.StartDate現在2017年7月5日12:00:00

用戶後同步數據對服務器,出現這種情況:

enter image description here

日期在SqlLite數據庫(客戶端):2017年7月5日12:00:00

服務器數據庫中的日期:2017-07-05 10:00:00

因此,我認爲Azure會將我的日期更改爲UTC。這在技術上可能是正確的,因爲您應該始終將UTC存儲在數據庫中,並在客戶端處理時區轉換。但不幸的是,服務器數據庫是舊的並存儲區域設置日期。

如何使Azure存儲從服務器數據庫中的客戶端獲得本地日期而不是UTC?

我試圖在Azure中WEBSITE_TIME_ZONE屬性更改爲我的本地時區,但是,這並不工作:http://www.louischarlesgagnon.com/post/azure-app-service-set-timezone-for-your-web-application

更新2017年6月7日:

經過進一步的研究,我發現,這是一個已知的「問題」。

看看這裏:

https://github.com/Azure/azure-mobile-apps-net-client/issues/131

Azure Mobile Apps saves incorrect datetime in Sqlite database

https://forums.asp.net/t/1808269.aspx?DateTime+issues+with+Azure+c+javascript+sql+so+confused+

閱讀本我是能夠建立能解決問題的部分解決方案後。在客戶端,我現在正在做這樣的事情。

public System.DateTime? Start 
    { 
     get 
     { 
      System.DateTime? dateTime = GetValue<System.DateTime?>(_start); 
      if (dateTime.HasValue) 
       dateTime = System.DateTime.SpecifyKind(dateTime.Value, System.DateTimeKind.Utc); 

      return dateTime; 
     } 
     set 
     { 
      System.DateTime? dateTime = value; 
      if (dateTime.HasValue) 
       dateTime = System.DateTime.SpecifyKind(dateTime.Value, System.DateTimeKind.Utc); 

      SetValue<System.DateTime?>(_start, dateTime); 
     } 
    } 

這告訴Azure日期已經是UTC,Azure不必轉換。這適用於在客戶端創建的System.DateTime現在已成功存儲在服務器數據庫中而無需轉換的情況。

但現在有一個另外一個問題:

當Azure的返回存儲在服務器數據庫中的客戶端的日期,天青轉換「UTC日期」到本地日期。以下是當前情況的示例:

客戶端日期:06.07。2017年14:30

- >客戶端推送日至服務器

服務器日期:2017年6月7日14:30

- >客戶端從服務器獲取日期

客戶日期:2017年6月7日16 :30

+0

您可以在本地時間轉換爲UTC,並將其存儲!如果需要,我可以爲您提供代碼! – Sridharan

+0

請查看我在第一篇文章中的更新 – OPunktSchmidt

回答

1

但不幸的是,服務器數據庫是舊的,並且存儲了本地日期。如何讓Azure將來自客戶端的本地日期存儲在服務器數據庫中而不是UTC?

根據您的描述,我建議您可以存儲長類型值DateTime.UtcNow.Ticks作爲您的日期時間不使用日期時間類型。

該值將不會在你的服務器數據庫被改變,它可以被轉換回UTC時間。

當你想用的時候,你可以轉換蜱回日期時間。

更多細節,你可以參考這些代碼:

//get utc time ticks 
    long i = DateTime.UtcNow.Ticks; 
    //convert back to local time 
    DateTime myDate = new DateTime(i).ToLocalTime(); 

我正確的,我已經適應我的遺留應用程序,使他們能夠應對UTC?

在我看來,我建議你可以存儲UTC時間到你的數據庫。然後,您可以將UTC時間轉換爲當地時間。這是設計您的應用程序的正確方法。如果有不同的時區客戶,那麼如何將數據庫的本地時間轉換爲客戶時區的當地時間?

UTC是世界各地普遍使用的時間標準。世界時間中心已同意保持其時間尺度緊密同步 - 或協調一致 - 因此稱爲協調世界時。

因此,我建議您可以使用tolocaltime方法將UTC時間轉換爲您應用中的本地時間。

+0

我同意。這在技術上是一個很好的解決方案。不幸的是,有很多基於服務器數據庫的遺留應用程序。我不能只改變服務器數據庫中的數據類型來存儲UTC(滴答)。 這意味着我將不得不基於此數據庫更改所有應用程序以使用新的utc日期。 我需要無服務器數據庫的解決方案改變 – OPunktSchmidt

+0

你能告訴我你現在已經使用的數據庫? Azure的SQL數據庫或其他東西? –

+0

我們使用SQL Server 2016.安裝在本公司的本地機器上。 Azure App Service只是應用程序(客戶端)和我們公司的sql server之間的代理。 – OPunktSchmidt