在c#中检索准确的客户端时间

Retrieving exact clients time in C#

本文关键字:客户端 时间 检索      更新时间:2023-09-26

为了节省用户的时间和数据,我一直在使用DateTime.Now;函数。在后期阶段,我使用JavaScript获取客户端的日期和时间来维护time Zone。但是当我更改系统的日期和时间并尝试使用JavaScript时。它显示了我的电脑的时间变化。我需要如何让客户正确的当前日期和时间值。如何得到它。

请不要超过c# &javascript .

当使用不同时区的客户端/服务器时,您应该使用UTC

例如在c#中使用DateTime。UTCNow而不是DateTime.UTC。每次保存时,您都应该保存时区,稍后您将能够计算本地时间。

你似乎在问"我如何确定客户的真实时区,即使他们的计算机时钟设置不正确?"如果是,请更新你的问题,说得更清楚。

你不能从JavaScript中做到这一点:它怎么能知道任何时间或时区,而不是计算机告诉它的(这两者都是基于用户设置的)?

在服务器端,您可以尝试ip地址到时区的映射,但实际上这仍然只是一个有根据的猜测。(如果你想继续学习,可以谷歌一下。)

你可以黑进他们的网络摄像头,并希望它指向墙上的时钟。

在客户端,当客户端用javascript发送请求时,获取新的Date(). tojson()值并将其发送到服务器。toJSON()返回当前客户端日期时间在GMT+0000时区(格林威治):

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

在服务器端,在c#中:

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
}

上面的代码是必需的,客户端和服务器上的时间已经与全局时钟(例如internet时间源服务器)同步。为了避免这个问题,你可以计算和保存(在会话中,例如)初始(在第一次请求时)客户端和服务器时钟之间的差异,并将这个"差异"添加到maxmin变量中。这个行为是简单的编码,并没有显示在上面的代码。

DateTime.Now在服务器上运行并获得服务器上配置的日期时间,而不是在客户端上。

你将不得不使用javascript来获取客户端的时间,你可以通过一个隐藏字段传递值,该字段可以使用javascript的new Date()方法存储。要从GMT获取偏移量,请使用Date.getTimezoneOffset(),它将以分钟为单位给出偏移量,例如对于+ 1 GMT,它将返回-60。

最好以GMT格式维护所有日期时间信息,然后根据客户端需要使用偏移量。

您无法获得实际的机器时间。您可以尝试计算客户端的时区,然后进行相应的调整。

快速搜索一下这篇文章,它实现了一个解决方案,解决了使用JavaScript Date对象的一些问题。

始终在服务器端以一种格式维护日期时间。我更喜欢DateTimeOffset,它可以为我以正确的格式存储它。你一定要仔细阅读:http://msdn.microsoft.com/en-us/library/system.datetimeoffset.aspx

关于在客户端渲染它,你有两个选择:

A)将客户端的时区存储在cookie中,当他登录时,然后使用该时区为我们的客户端提供所有的日期时间。

B)或者你需要在客户端执行你的时间巫术以获得最佳结果,这可以使用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()方法。