2011-09-02 60 views
1

直到今天,我使用DateTime.Now;函數來節省用戶的時間和數據。那麼在後期階段,我使用JavaScript來獲取客戶的日期和時間來維護時區。但是當我改變系統的日期和時間並嘗試使用JavaScript時。它顯示了我電腦的更改時間。我需要如何讓客戶正確的當前日期和時間值。如何得到它。在C中檢索確切的客戶端時間#

請不要超過C#以上的答案#& JavaScripts。

回答

1

在客戶端上,當客戶端用javascript發送請求時,獲取新的Date()。toJSON()值並將其發送到服務器。在客戶端

DateTime dtServer=DateTime.Now; 
DateTime dtClient=DateTime.Parse(Request.QueryString["dtStr"]); // Or Request.Form 
double requestTimeDelta=10f; // max time in seconds between client starts the request, 
          // and this code lines is executed. 
double secondsDelta=2f; 
DateTime max=dtClient.AddSeconds(requestTimeDelta+secondsDelta); 
DateTime min=dtClient.AddSeconds(-secondsDelta); 
if (max>=dtServer && min<=dtServer) { 
    // time is correct 
} 
else 
{ 
    // time is incorrect 
} 

上面的代碼是必需的,即時間和服務器一直以:的toJSON()返回GMT + 0000時區當前客戶端的日期時間(格林尼治):

var dtStr=new Date().toJSON(); 

在服務器,在C#與全球時鐘同步(例如,互聯網時間源服務器)。爲了避免這個問題,您可以計算並保存(例如在會話中)初始(在第一次請求時)客戶端和服務器時鐘之間的差異,並將此差異添加到maxmin變量中。這種行爲只是爲了編碼,而不是在上面的代碼中顯示。

+0

我收到此錯誤。 '錯誤非可調用成員'System.Web.HttpRequest.QueryString'不能像方法一樣使用。' – Mal

+0

@Kars。我正在修改代碼。這僅用於證明'dtStr'請求參數必須傳遞給調用'.Parse'方法。 –

+0

我以前試過,但我得到這個錯誤'未將字符串引用設置爲字符串的實例。 參數名稱:s' – Mal

3

當與不同時區的客戶機/服務器的工作,你應該使用UTC

例如在C#中使用DateTime.UTCNow而不是DateTime.UTC。 沿着每次保存時您都應該保存時區,稍後您可以計算當地時間。它也適用於夏令時更改。

+0

這是正確的答案。 –

+0

好吧。以UTC檢索時間以及如何將時間轉換爲客戶的時區。 – Mal

+0

@卡爾斯檢查我的答案如何獲得轉換抵消 – V4Vendetta

1

DateTime.Now在服務器上運行並獲取服務器上配置的日期時間,而不是客戶端上配置的日期時間。

您將不得不使用JavaScript獲取客戶端時間,您可以通過隱藏字段傳遞值,該隱藏字段可以使用JavaScript的new Date()方法存儲。要得到GMT的偏移量,使用Date.getTimezoneOffset(),這會使分鐘的偏移量表示爲+ 1 GMT,它將返回-60。

如果以GMT格式維護所有日期時間信息,然後使用偏移量來滿足客戶需求,那將會很不錯。

+0

嗯,同時檢索客戶的時間和日期。如果用戶修改計算機的時間和日期並使用此JavaScript。這個JavaScript如何檢測用戶的時間錯誤。 – Mal

+0

在這種情況下,沒有簡單的解決方案,也許你需要獲得IP分配並追蹤到時區 – V4Vendetta

0

您無法獲得實際的機器時間。您可以嘗試計算客戶端的時區,然後進行相應的調整。

快速搜索調出this post,它實現了一個解決方案,該解決方案解決了使用JavaScript Date對象的一些問題。

0

始終在服務器端保持一種格式的日期時間。我喜歡的DateTimeOffset而這需要將其存儲在我的正確格式的照顧。你一定要對讀了起來:http://msdn.microsoft.com/en-us/library/system.datetimeoffset.aspx

關於使其在客戶端以及你有兩種選擇:

A)在客戶登錄時將客戶時區存儲在cookie中,然後使用此時區將所有日期時間提供給我們的客戶。

B)或者您需要在客戶端執行您的時間voodoo以獲得最佳結果,並且這可以使用javascript來實現。你需要確保你傳遞一個值(比如說UTC)回到你的客戶端,並且你也需要解析你的UTC時間。

這裏是一個簡潔的函數來解析你的時間到UTC然後發送到服務器

function getDateAsUTC(time, date) { 
    var regExTime = /^(\d{1,2}):(\d{2})([AP]M)?$/i; 
    var invalidTimeString="invalid time"; 
    if (segmentsTime = time.replace(" ", "").match(regExTime)) { 
     if (segmentsTime[3]) { 
      // 12-hour time format with am/pm 
      if (parseInt(segmentsTime[1],10) < 1 || parseInt(segmentsTime[1],10) > 12) { 
       time = invalidTimeString; 
      } 
     } 
     else { 
      // 24-hour time format 
      if (parseInt(segmentsTime[1],10) > 23) { 
       time = invalidTimeString; 
      } 
     } 
     if (time !== invalidTimeString && parseInt(segmentsTime[2],10) > 59) { 
      time = invalidTimeString; 
     } 
    } 
    else { 
     time = invalidTimeString; 
    } 

    if (time !== invalidTimeString) { 
     var jsDateFriendlyTime = segmentsTime[1] + ":" + segmentsTime[2] + " " + segmentsTime[3]; 
     return new Date(date + " " + jsDateFriendlyTime).toGMTString().replace("UTC", "GMT"); 
    } 
    else{ 
     return time; 
    } 
} 

並且爲了以正確的格式呈現時間,您可以使用toLocaleDateString() method

2

您似乎在問:「即使計算機的時鐘設置不正確,我如何確定客戶端的真實時區?」如果是這樣,請更新您的問題,說得更清楚。

你不能用JavaScript做到這點:它怎麼能知道計算機告訴它的任何時間或時區(兩者都是基於用戶設置的)?

在服務器端,你可以嘗試一個IP地址到時區映射,但實際上這仍然只是一個受過教育的猜測。 (谷歌它,如果你想追求它。)

你可以入侵他們的網絡攝像頭,並希望它指向牆上的時鐘。