直到今天,我使用DateTime.Now;
函數來節省用戶的時間和數據。那麼在後期階段,我使用JavaScript來獲取客戶的日期和時間來維護時區。但是當我改變系統的日期和時間並嘗試使用JavaScript時。它顯示了我電腦的更改時間。我需要如何讓客戶正確的當前日期和時間值。如何得到它。在C中檢索確切的客戶端時間#
請不要超過C#以上的答案#& JavaScripts。
直到今天,我使用DateTime.Now;
函數來節省用戶的時間和數據。那麼在後期階段,我使用JavaScript來獲取客戶的日期和時間來維護時區。但是當我改變系統的日期和時間並嘗試使用JavaScript時。它顯示了我電腦的更改時間。我需要如何讓客戶正確的當前日期和時間值。如何得到它。在C中檢索確切的客戶端時間#
請不要超過C#以上的答案#& JavaScripts。
在客戶端上,當客戶端用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#與全球時鐘同步(例如,互聯網時間源服務器)。爲了避免這個問題,您可以計算並保存(例如在會話中)初始(在第一次請求時)客戶端和服務器時鐘之間的差異,並將此差異添加到max
和min
變量中。這種行爲只是爲了編碼,而不是在上面的代碼中顯示。
當與不同時區的客戶機/服務器的工作,你應該使用UTC
例如在C#中使用DateTime.UTCNow而不是DateTime.UTC。 沿着每次保存時您都應該保存時區,稍後您可以計算當地時間。它也適用於夏令時更改。
DateTime.Now
在服務器上運行並獲取服務器上配置的日期時間,而不是客戶端上配置的日期時間。
您將不得不使用JavaScript獲取客戶端時間,您可以通過隱藏字段傳遞值,該隱藏字段可以使用JavaScript的new Date()
方法存儲。要得到GMT的偏移量,使用Date.getTimezoneOffset()
,這會使分鐘的偏移量表示爲+ 1 GMT,它將返回-60。
如果以GMT格式維護所有日期時間信息,然後使用偏移量來滿足客戶需求,那將會很不錯。
嗯,同時檢索客戶的時間和日期。如果用戶修改計算機的時間和日期並使用此JavaScript。這個JavaScript如何檢測用戶的時間錯誤。 – Mal
在這種情況下,沒有簡單的解決方案,也許你需要獲得IP分配並追蹤到時區 – V4Vendetta
您無法獲得實際的機器時間。您可以嘗試計算客戶端的時區,然後進行相應的調整。
快速搜索調出this post,它實現了一個解決方案,該解決方案解決了使用JavaScript Date
對象的一些問題。
始終在服務器端保持一種格式的日期時間。我喜歡的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。
您似乎在問:「即使計算機的時鐘設置不正確,我如何確定客戶端的真實時區?」如果是這樣,請更新您的問題,說得更清楚。
你不能用JavaScript做到這點:它怎麼能知道計算機告訴它的任何時間或時區(兩者都是基於用戶設置的)?
在服務器端,你可以嘗試一個IP地址到時區映射,但實際上這仍然只是一個受過教育的猜測。 (谷歌它,如果你想追求它。)
你可以入侵他們的網絡攝像頭,並希望它指向牆上的時鐘。
我收到此錯誤。 '錯誤非可調用成員'System.Web.HttpRequest.QueryString'不能像方法一樣使用。' – Mal
@Kars。我正在修改代碼。這僅用於證明'dtStr'請求參數必須傳遞給調用'.Parse'方法。 –
我以前試過,但我得到這個錯誤'未將字符串引用設置爲字符串的實例。 參數名稱:s' – Mal