2009-09-06 212 views
1

我認爲我是在稍微解決這個問題,我希望有人能幫助我。ASP.NET日期/時間轉換

我有一個SQL Server後端的ASP.NET應用程序。我將所有日期都以UTC格式存儲,並對瀏覽器的本地時區進行適當轉換。其中一頁要求提供開始日期和結束日期(不是時間)。

我正在將開始日期和時間設置爲00:00:00小時(午夜),並且我正在結束時間並添加23:59:59的時間,以便日期範圍覆蓋一整天。現在我想要做的是做一個SQL查詢來搜索這個日期範圍內的記錄。問題是,SQL中的數據是UTC時間,用戶在他們的本地日期和時間輸入日期和時間。

我最快的解決方案是將日期和時間轉換爲UTC,然後搜索記錄。但是,通過這樣做,我相信ASP.NET會根據服務器時區將給定的時間和日期轉換爲UTC。

如何根據用戶的時區將日期和時間轉換爲UTC時間?

+0

[Here](http://stackoverflow.com/questions/246498/creating-a-datetime-in-a-specific-time-zone-in-c-fx-3-5)是一個非常類似的問題,也來自* stackoverflow.com *。 – 2009-09-06 03:13:16

回答

1

當您接受用戶的輸入時,請確保使用帶有DateTimeKind參數的DateTime構造函數。通過這種方式,您可以在創建對象時指定它們的輸入採用UTC。

var userInputTime = new DateTime(year, month, day, 
           hour, minute, second, 
           DateKind.Utc); 

DateTime對象上調用.ToUniversalTime()不會有任何效果。

如果您改用其輸入並使用更簡單的構造函數創建DateTime,則默認情況下DateTimeKind將設置爲「Local」,因此當您進行UTC轉換時,它實際上會改變它。

+0

是的,但UTC轉換不假定時區是Web服務器時區?或者它實際上是從瀏覽網站的瀏覽器本地時間轉換而來的? – Icemanind 2009-09-06 03:39:59

+0

這將是服務器時間。 OP需要計算提交的時區與UTC之間的時差,執行轉換,並在將其存儲到數據庫之前創建UTC日期。 – womp 2009-09-06 05:26:05

0

你想看看MySQL的函數:

CONVERT_TZ(DT,FROM_TZ,轉到to_tz)

CONVERT_TZ()轉換由FROM_TZ給予時區時區中的日期時間值DT通過轉到to_tz給出並返回結果值。時區可按第5.10.8節「MySQL服務器時區支持」中所述進行指定。 ...

mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET'); 
     -> '2004-01-01 13:00:00' 
mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00'); 
     -> '2004-01-01 22:00:00' 
0

你以爲是正確的 - 時間轉換是基於服務器的時區。 ServerVariables(例如)中沒有任何內容傳遞用戶的本地時間。

話雖如此,你有兩個選擇:

  1. 如果你做任何類型的用戶分析,你可以存儲用戶的UTC偏移那裏,記得它爲您計算。這隻與...一樣可靠......以及您的用戶。
  2. 在用戶填寫的輸入表單中,您可以使用Javascript(不是IIS!)創建或填充本地日期/時間的隱藏INPUT字段。 This link可能會幫助你一點。

#2的唯一注意事項是用戶的工作站是否進行時間同步並獲得正確的UTC偏移量。

0

如果您使用.net 3。5使用TimeZoneInfo