JavaScript GetDate 无法跨区域工作

JavaScript GetDate not working across regions

本文关键字:区域 工作 GetDate JavaScript      更新时间:2023-09-26

我有一些JS代码,它接收客户端的日期/时间并将其传递给服务器,如下所示:

function SetPostbackValues() {
        //Function that gets the client machine datetime and stores it in a hidden field
        // so it may be used in code behind.
        var date = new Date();
        var day = date.getDate();        // yields day
        if (day < 10)
            day = '0' + day;
        var month = date.getMonth() + 1;    // yields month
        if (month < 10)
            month = '0' + month;
        var year = date.getFullYear();  // yields year
        var hour = date.getHours();     // yields hours
        if (hour < 10)
            hour = '0' + hour;
        var minute = date.getMinutes(); // yields minutes
        if (minute < 10)
            minute = '0' + minute;
        var second = date.getSeconds(); // yields seconds
        if (second < 10)
            second = '0' + second;
        var time = day + "/" + month + "/" + year + " " + hour + ':' + minute + ':' + second;
        var hiddenControl = '<%= hfDateTime.ClientID %>';
        document.getElementById(hiddenControl).value = time;
    }

我的问题是,当客户端时区设置为英国标准 dd/MM/yyyy 时,代码工作正常,但是当美国客户端连接时,转换为 DateTime 会抛出错误,指出它的格式不正确。

因为我分别获取每个月、日、年并将它们组合在一起,所以我不明白为什么它不适用于不同的区域设置。

尝试将日期时间插入 SQL 时发生此错误:

using (SqlCommand cmd = new SqlCommand("Remove", con))
                    {
                        string test = (this.Master.FindControl("hfDateTime") as HiddenField).Value;
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Parameters.Add("@RemovalDate", SqlDbType.DateTime).Value = (this.Master.FindControl("hfDateTime") as HiddenField).Value; //Get the client's datetime.
                        con.Open();
                        insertedRecordID = (int)cmd.ExecuteScalar();
                    }

错误为 {"无法将参数值从字符串转换为日期时间。

测试的值是:"19/02/2016 10:55:45",这对我来说没有错。

我认为你应该使用这个:

function SetPostbackValues() {
    var date = new Date();        
    var hiddenControl = '<%= hfDateTime.ClientID %>';
    document.getElementById(hiddenControl).value = date.toISOString();
}

并将代码隐藏更改为

cmd.Parameters.Add("@RemovalDate", SqlDbType.DateTime).Value = DateTime.Parse((this.Master.FindControl("hfDateTime") as HiddenField).Value);

使用(new Date()).getTime()避免使用不同的日期时间格式可能更容易。请注意,C# DateTime 的构造函数基础和规模与 Javascript 不同。

根据您需要 UTC 还是本地时间,减去 datevalue.getTimezoneOffset() * 60000