2017-08-24 27 views
0

我正在使用ASP.Net後端。我以UTC時間將所有日期從客戶端保存到數據庫。UTC date.ToLocalTime()仍然以UTC時間產生日期

我有一個後端的功能,導出一些記錄,我想將提取的日期從UTC時間轉換爲用戶的本地時間,然後再顯示它們。

我已經嘗試了大量StackOverflow中提出的解決方案,但它們都沒有將日期轉換爲本地時間,即使這在客戶端上顯示這些日期時有效。我懷疑服務器已經認爲日期是在當地時間,但我不知道如何解決它。

下面是不同的解決方案我曾嘗試:

//1. 

var alertTime = record.TimeRecorded.GetValueOrDefault().ToLocalTime().ToString("hh:mm tt"); 


// 2. 
var alertTime = record.TimeRecorded; 

if (alertTime.HasValue) 
    { 
     var timeInUtc = TimeZoneInfo.ConvertTimeToUtc(alertTime.Value); 
    string alertTimeToLocalTime = timeInUtc.ToLocalTime().ToString("hh:mm tt"); 

    } 

//alertTimeToLocalTime is still in UTC time here 

// 3. 

if (alertTime.HasValue) 
    { 
     var localTime = TimeZoneInfo.ConvertTimeFromUtc(timeInUtc, TimeZoneInfo.Local); 
     string alertTimeToLocalTime = localTime.ToString("hh:mm tt"); 

    } 

這些都沒有設法將alertTime轉換爲本地時間。

我錯過了什麼嗎?

編輯

//4. Another approach I had already tried which didn't work as well 

var alertTime = DateTime.SpecifyKind(record.TimeRecorded.GetValueOrDefault(), DateTimeKind.Utc); 
alertTimeToLocalTime = alertTime.ToLocalTime().ToString("hh:mm tt"); 
+0

Check out https://stackoverflow.com/questions/179940/convert-utc-gmt-time-to-local-time回答最佳回答 – Hubbs

+0

@Hubbs不幸的是,我已經嘗試過這一點,我仍然得到我在UTC時間的最後日期而不是當地時間。我用第4種方法添加了一個編輯,顯示了這個實現。 – naffie

回答

1

你說:

...從UTC時間到用戶的本地時間......在ASP.Net

什麼都不會告訴你用戶的本地時區。調用ToLocalTime將從UTC轉換爲服務器的時區(除非.Kind已經爲DateTimeKind.Local)。

在許多情況下,將服務器的時區設置爲UTC的最佳做法意味着您將看到ToLocalTimeToUniversalTime以外的其他類型的更改。而且由於服務器的時區在大多數情況下都不相關,所以這不是正確的方法。您可以通過其他機制(例如在您的應用程序中選擇它)來知道用戶的時區,以便您可以使用TimeZoneInfo.ConvertTime(或Noda Time)轉換服務器端,或者您需要發送UTC時間到達客戶端,並在JavaScript中執行utc-to-local(因爲瀏覽器正在用戶的時區中運行)。

一般而言,應避免在服務器應用程序(如ASP.NET)中使用「本地時間」。這包括ToLocalTime,ToUniversalTime,DateTimeKind.Local,TimeZoneInfo.Local,DateTime.Now,和其他一些其他的東西。

+0

你是絕對正確的馬特與此「...在許多情況下,將服務器的時區設置爲UTC的最佳做法將意味着您將看到ToLocalTime或ToUniversalTime沒有變化,除類型「...所以我決定從我的應用程序中獲取UTC的偏移量,然後將其傳遞到後端,並使用'AddHours'將它添加到'alertTime'對象中 – naffie

+0

請注意,偏移量必須只針對特定的時間戳,否則不會考慮時區內的偏移量變化,如夏時制 –

+0

更好的辦法是獲取實際的客戶端時區ID,而不僅僅是偏移量。 –

1

這是因爲你的DateTimeKind或者是LocalUnspecified。請參閱documentation for ToLocalTime()

從.NET Framework 2.0版開始,ToLocalTime方法返回的值由當前DateTime對象的Kind屬性確定。下表介紹了可能的結果。

  • Utc - 此DateTime實例已轉換爲本地時間。

  • 本地 - 未執行任何轉換。

  • 未指定 - 此DateTime實例被假定爲UTC時間,轉換的執行方式類似Kind爲Utc。

可以使用SpecifyKind method設置之前做轉換的類。

+0

不幸的是,我已經嘗試了這一點,它也沒有工作。我已經將它作爲方法4添加到了上面的問題中,以向您展示我是如何做到的。 – naffie

+0

嗯!好奇。我不知道然後:( – Amy