6

在我的 Kendo Grid 上,我从服务器接收日期时间。在客户端,此时间更改为客户端的时区并显示。如何显示从服务器到客户端的相同时间。

以下是我用于绑定日期时间的剑道代码。

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

6 回答 6

5

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

这将帮助您:

http://www.kendoui.c​​om/code-library/mvc/grid/using-utc-time-on-both-client-and-server-sides.aspx

于 2013-10-01T06:13:50.643 回答
3

这是我的解决方案

在控制器上我确实喜欢这个

日期时间时间 = DateTime.Now();

string x = time.ToString("MM/dd/yyyy hh:mm:ss tt");

在视图中

columns.Bound(p => px);

它也是可排序的。

于 2013-10-08T08:36:38.097 回答
3

例如,您的客户端机器在悉尼,而您的代码部署在印度

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

如果您的日期时间字段不可编辑,请遵循解决方案 1,否则解决方案 2 将是正确的选择

从数据库中检索

解决方案1:

客户端代码

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

服务器端代码:

格式的服务器模型属性

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) { 

                    } 

         });

服务器端代码:

//服务器时区(印度)偏移分钟: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;
于 2019-07-27T04:13:08.413 回答
1

另一种选择是使用自定义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方法更改为 returnIsoDateJsonResult而不是ActionResult/JsonResult.

于 2016-08-18T05:35:51.203 回答
1

解决方案 2 在我的上述答案中,如果您不在夏令时期间,则会添加夏令时,但您正在尝试访问属于夏令时的日期,重写解决方案 2 以支持夏令时

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

    $.ajax({
            type: "POST",
            url: '@Url.Action("Controller action method name", "Controller name")',
            data: { "timeZoneName": Intl.DateTimeFormat().resolvedOptions().timeZone },
            success: function (data) {
                    }
            });

在会话中更新时区的控制器方法名称:

   public ActionResult actionMethod(string timeZoneName)
    {
        Session["timeZoneName"] = Convert.ToString(timeZoneName);
        return Json(new { success = true });
    }

应用配置应用设置条目:

<add key ="Europe/London"  value ="GMT Standard Time" />

这里的关键是浏览器返回并在会话中维护的客户端时区名称,我们必须为所有时区添加条目

将以下代码放在控制器操作方法中以获取考试日期:

var clientMachineTimeZoneName = Convert.ToString(Session["timeZoneName"]);

Get the sever timezone id from config for the corresponding time zone which we got from client side
var timeZoneId = ConfigurationManager.AppSettings[clientMachineTimeZoneName];

TimeZoneInfo clientTimezoneDetails = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);

var clientTimeZoneOffsetMinutes = clientTimezoneDetails.GetUtcOffset(x.ExamDate.Value).TotalMinutes * -1;
var serverAndClientMachineTimeZoneDifferenceInMinutes = clientTimeZoneOffsetMinutes + TimeZoneInfo.Local.GetUtcOffset(x.ExamDate.Value).TotalMinutes;

//Update your date time field with this offset minutes
ExamDate = ExamDate.Value.AddMinutes(serverAndClientMachineTimeZoneDifferenceInMinutes);
于 2019-10-21T12:20:49.923 回答
0

在我的情况下,服务器在 CST 中,而我在 MST 中。我需要将我的 SQL Server 数据保存到浏览器中,并且在我的 Kendo Grid 上将 02/08/18 23:57 变为 02/08/18 22:57。所以我做了这个,希望它有帮助:

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

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

使用 .dbDate 类查看 Kendo Grid 上的列

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

使用 Moment.js 根据我们传递它的小时数差异 (diff) 来转换 (convertedTime) 它。

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

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

将 Grid 传回更新的日期和时间。

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

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)
    })
}
于 2018-02-21T22:56:17.170 回答