Asp.net mvc 剑道网格自动改变时区

Asp.net mvc 剑道网格自动改变时区,asp.net-mvc,datetime,kendo-grid,kendo-asp.net-mvc,Asp.net Mvc,Datetime,Kendo Grid,Kendo Asp.net Mvc,在我的剑道网格中,我从服务器接收日期时间。在客户端,此时间更改为客户端的时区并显示。如何显示从服务器到客户端的相同时间 下面是我绑定datetime的剑道代码 columns.Bound(p => p.CreateDate).Format("{0:dd/MM/yyyy hh:mm:ss}").Sortable(true).Width(180); 由于日期是在返回服务器响应时在客户机上创建的,因此日期总是根据浏览器的时区使用偏移量创建的 这将帮助您: 这是我的解决方案 在控制器上,我是这样

在我的剑道网格中,我从服务器接收日期时间。在客户端,此时间更改为客户端的时区并显示。如何显示从服务器到客户端的相同时间

下面是我绑定datetime的剑道代码

columns.Bound(p => p.CreateDate).Format("{0:dd/MM/yyyy hh:mm:ss}").Sortable(true).Width(180);

由于日期是在返回服务器响应时在客户机上创建的,因此日期总是根据浏览器的时区使用偏移量创建的

这将帮助您:

这是我的解决方案

在控制器上,我是这样做的

DateTime=DateTime.Now()

string x=time.ToString(“MM/dd/yyyy hh:MM:ss tt”)

在望

columns.Bound(p=>p.x)


它也可以排序。

另一个选项是使用自定义
JsonResult
并将日期转换为
ISO
格式

public class IsoDateJsonResult : JsonResult
{
    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        HttpResponseBase response = context.HttpContext.Response;

        if (!String.IsNullOrEmpty(ContentType))
        {
            response.ContentType = ContentType;
        }
        else
        {
            response.ContentType = "application/json";
        }
        if (ContentEncoding != null)
        {
            response.ContentEncoding = ContentEncoding;
        }
        if (Data != null)
        {
            var isoConvert = new IsoDateTimeConverter();
            response.Write(JsonConvert.SerializeObject(Data, isoConvert));
        }
    }

然后更改您的
Controller
方法以返回
IsoDateJsonResult
,而不是
ActionResult/JsonResult
,在我的情况下,服务器在CST中,我在MST中。我需要将我的SQL Server数据持久化到浏览器中,并在剑道网格上获得02/08/18 23:57,即02/08/18 22:57。所以我这么做了,希望能有所帮助:

检查用户/浏览器的时区偏移

获取与服务器时区偏移量的小时差

查看剑道网格上class.dbDate为的列

从数据对象获取该单元格中的日期(displayedTime)

使用Moment.js根据传递时间的小时差(diff)转换(convertedTime)

格式将时间转换为所需格式,即02/08/18 23:57

将1添加到i,以便调整对象中的下一个日期

将网格返回更新的日期和时间

必须在页面/网格加载/更新上最后运行

function getDateOffset() {
    var date = new Date();
    var offset;
    var diff;
    offset = date.getTimezoneOffset()
    if (offset > 360) { //360 = CST
        diff = +(offset - 360) / 60
    } else if (offset < 360) {
        diff = -(360 - offset) / 60
    } else {
        diff = 0
    }

    $(".dbDate").each(function (i) {

        var grid = $('#Grid').data('kendoGrid');
        var displayedTime = grid.dataSource.data()[i].TicketDateTime
        var convertedTime = new moment(displayedTime).add(diff, 'hours').toDate();
        var originalTime = moment(convertedTime).format("MM/DD/YY HH:mm");

        i + 1
        $(this).html(originalTime)
    })
}
函数getDateOffset(){ 变量日期=新日期(); var偏移; var-diff; 偏移量=日期。getTimezoneOffset() 如果(偏移量>360){//360=CST 差异=+(偏移量-360)/60 }否则如果(偏移量<360){ 差异=-(360-偏移)/60 }否则{ 差异=0 } $(“.dbDate”)。每个(函数(i){ var grid=$(“#grid”).data('kendoGrid'); var displayedTime=grid.dataSource.data()[i].TicketDateTime var convertedTime=新时刻(displayedTime).add(diff,'hours').toDate(); var originalTime=力矩(转换时间)。格式(“MM/DD/YY HH:MM”); i+1 $(this.html(原始时间) }) }
例如,您的客户机在悉尼,而您的代码部署在印度

将日期时间保存到数据库: 将日期时间从客户端(javascript)传递到服务器(.net)时,将其作为字符串传递,这样在保存到DB时不会转换为服务器的时间(UK)

如果datetime字段不可编辑,则遵循解决方案1,否则解决方案2将是正确的选择

从数据库中检索:

cols.Bound(c => c.ExamDate).ClientTemplate(("#= ExamDateString #")).Hidden(false).Filterable(x => x.Cell(cell => cell.ShowOperators(false).Operator(StringOperator.eq.ToString())));
解决方案1:

$.ajax({ 

            type: "POST", 

            url: '@Url.Action("Controller action method name", "Controller name")', 

            data: { "clientMachineTimeZoneOffsetInMinutes ": (new Date()).getTimezoneOffset() }, 

                success: function (data) { 

                    } 

         });
    $.ajax({
            type: "POST",
            url: '@Url.Action("Controller action method name", "Controller name")',
            data: { "timeZoneName": Intl.DateTimeFormat().resolvedOptions().timeZone },
            success: function (data) {
                    }
            });
<add key ="Europe/London"  value ="GMT Standard Time" />
客户端代码

cols.Bound(c => c.ExamDate).ClientTemplate(("#= ExamDateString #")).Hidden(false).Filterable(x => x.Cell(cell => cell.ShowOperators(false).Operator(StringOperator.eq.ToString())));
服务器端代码:

$.ajax({ 

            type: "POST", 

            url: '@Url.Action("Controller action method name", "Controller name")', 

            data: { "clientMachineTimeZoneOffsetInMinutes ": (new Date()).getTimezoneOffset() }, 

                success: function (data) { 

                    } 

         });
    $.ajax({
            type: "POST",
            url: '@Url.Action("Controller action method name", "Controller name")',
            data: { "timeZoneName": Intl.DateTimeFormat().resolvedOptions().timeZone },
            success: function (data) {
                    }
            });
<add key ="Europe/London"  value ="GMT Standard Time" />
格式的服务器模型属性

public string ExamDateString 
    { 
        get 
        { 
        return ExamDate.HasValue ? ExamDate.Value.ToString("dd/MM/yyyy hh:mm:ss") : string.Empty; 
        } 
    }
解决方案2:

$.ajax({ 

            type: "POST", 

            url: '@Url.Action("Controller action method name", "Controller name")', 

            data: { "clientMachineTimeZoneOffsetInMinutes ": (new Date()).getTimezoneOffset() }, 

                success: function (data) { 

                    } 

         });
    $.ajax({
            type: "POST",
            url: '@Url.Action("Controller action method name", "Controller name")',
            data: { "timeZoneName": Intl.DateTimeFormat().resolvedOptions().timeZone },
            success: function (data) {
                    }
            });
<add key ="Europe/London"  value ="GMT Standard Time" />
从数据库检索:

$.ajax({ 

            type: "POST", 

            url: '@Url.Action("Controller action method name", "Controller name")', 

            data: { "clientMachineTimeZoneOffsetInMinutes ": (new Date()).getTimezoneOffset() }, 

                success: function (data) { 

                    } 

         });
    $.ajax({
            type: "POST",
            url: '@Url.Action("Controller action method name", "Controller name")',
            data: { "timeZoneName": Intl.DateTimeFormat().resolvedOptions().timeZone },
            success: function (data) {
                    }
            });
<add key ="Europe/London"  value ="GMT Standard Time" />
客户端代码:

$.ajax({ 

            type: "POST", 

            url: '@Url.Action("Controller action method name", "Controller name")', 

            data: { "clientMachineTimeZoneOffsetInMinutes ": (new Date()).getTimezoneOffset() }, 

                success: function (data) { 

                    } 

         });
    $.ajax({
            type: "POST",
            url: '@Url.Action("Controller action method name", "Controller name")',
            data: { "timeZoneName": Intl.DateTimeFormat().resolvedOptions().timeZone },
            success: function (data) {
                    }
            });
<add key ="Europe/London"  value ="GMT Standard Time" />
服务器端代码:

$.ajax({ 

            type: "POST", 

            url: '@Url.Action("Controller action method name", "Controller name")', 

            data: { "clientMachineTimeZoneOffsetInMinutes ": (new Date()).getTimezoneOffset() }, 

                success: function (data) { 

                    } 

         });
    $.ajax({
            type: "POST",
            url: '@Url.Action("Controller action method name", "Controller name")',
            data: { "timeZoneName": Intl.DateTimeFormat().resolvedOptions().timeZone },
            success: function (data) {
                    }
            });
<add key ="Europe/London"  value ="GMT Standard Time" />
//服务器时区(印度)偏移分钟数:330

//客户端时区(悉尼)偏移分钟:-600

//客户端和服务器时区偏移分钟数之差=-270

var serverTimeZoneOffsetInMinutes = DateTimeOffset.Now.Offset.TotalMinutes;
var serverAndClientMachineTimeZoneDifferenceInMinutes = clientMachineTimeZoneOffsetInMinutes + serverTimeZoneOffsetInMinutes; 

//Update your date time field with this offset minutes
ExamDate = ExamDate.Value.AddMinutes(serverAndClientMachineTimeZoneDifferenceInMinutes);
解决方案3:
解决方案2不会处理夏令时场景,这将是处理所有场景的理想解决方案

在将数据源结果从控制器操作方法返回到剑道网格之前,请执行以下操作,它将停止转换

       var response = new ContentResult
        {
            Content = JsonConvert.SerializeObject(value, new JsonSerializerSettings
            {
                DateTimeZoneHandling = DateTimeZoneHandling.Local,
                DateFormatString = "yyyy-MM-ddTHH:mm:ss"
            }),
            ContentType = "application/json"
        };

        return response;

解决方案2在我上面的回答中,如果您不在夏时制期间,但您试图访问夏时制期间的日期,则会添加夏时制时间,并重写解决方案2以支持夏时制

用于更新时区名称的客户端代码:

$.ajax({ 

            type: "POST", 

            url: '@Url.Action("Controller action method name", "Controller name")', 

            data: { "clientMachineTimeZoneOffsetInMinutes ": (new Date()).getTimezoneOffset() }, 

                success: function (data) { 

                    } 

         });
    $.ajax({
            type: "POST",
            url: '@Url.Action("Controller action method name", "Controller name")',
            data: { "timeZoneName": Intl.DateTimeFormat().resolvedOptions().timeZone },
            success: function (data) {
                    }
            });
<add key ="Europe/London"  value ="GMT Standard Time" />
用于更新会话中时区的控制器方法名称:

   public ActionResult actionMethod(string timeZoneName)
    {
        Session["timeZoneName"] = Convert.ToString(timeZoneName);
        return Json(new { success = true });
    }
应用程序配置应用程序设置条目:

$.ajax({ 

            type: "POST", 

            url: '@Url.Action("Controller action method name", "Controller name")', 

            data: { "clientMachineTimeZoneOffsetInMinutes ": (new Date()).getTimezoneOffset() }, 

                success: function (data) { 

                    } 

         });
    $.ajax({
            type: "POST",
            url: '@Url.Action("Controller action method name", "Controller name")',
            data: { "timeZoneName": Intl.DateTimeFormat().resolvedOptions().timeZone },
            success: function (data) {
                    }
            });
<add key ="Europe/London"  value ="GMT Standard Time" />

这在本场景中很好,但不是所有场景的正确解决方案,假设我有一个出生日期字段,假设1970年1月1日或1970年12月31日,当您将其更改为UTC存储时,它将更改日期,并且在UTC中再次检索也将不起作用。想知道Kendo是否对此没有修复/解决方法。请记住,在这种情况下,使用日期选择器控件进行过滤将不起作用。您的意思是
columns.Bound(p=>p.x)?使用此方法也无法编辑该字段