在我的Kendo Grid上,我收到了服务器的日期时间。在客户端,此时间将更改为客户端的时区并显示。如何从服务器向客户端显示相同的时间。
以下是我绑定日期时间的剑道代码。
columns.Bound(p => p.CreateDate).Format("{0:dd/MM/yyyy hh:mm:ss}").Sortable(true).Width(180);
答案 0 :(得分:5)
由于在返回服务器的响应时在客户端上创建了日期 - 因此始终使用根据浏览器时区的偏移量创建日期
这将对您有所帮助:
http://www.kendoui.com/code-library/mvc/grid/using-utc-time-on-both-client-and-server-sides.aspx
答案 1 :(得分:3)
这是我的解决方案
控制器上的我确实喜欢这个
DateTime time = DateTime.Now();
string x = time.ToString(“MM / dd / yyyy hh:mm:ss tt”);
观看
columns.Bound(p => p.x);
它也是可以分类的。
答案 2 :(得分:1)
例如,您的客户端计算机位于悉尼,而您的代码已部署在印度
将日期时间保存到数据库: 在将日期时间从客户端(javascript)传递到服务器(.net)时,将其作为字符串传递,这样在保存到数据库中时不会将其转换为服务器的时间(UK)
如果您的日期时间字段不可编辑,请遵循解决方案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 :(得分:0)
另一种选择是使用自定义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
。
答案 4 :(得分:0)
在我的情况下,服务器在CST中,我在MST中。我需要将我的SQL Server数据保存到浏览器,并在我的Kendo Grid上获得02/08/18 23:57 02/08/18 22:57。所以我这样做了,希望它有所帮助:
检查用户/浏览器的时区偏移量
从服务器时区偏移
获取小时数差异使用类.dbDate
查看Kendo Grid上的一列从数据对象
中获取该单元格中的日期(displayedTime)使用Moment.js转换(convertedTime)它基于我们传递它的小时数(差异)。
格式将时间转换为所需格式,即02/08/18 23:57
向i添加1,以便调整对象中的下一个日期
将网格传回更新的日期和时间。
必须在页面/网格加载/更新上运行。
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)
})
}
答案 5 :(得分:0)
我上面的答案中的解决方案2,如果您不在夏令时,但您试图访问夏令时,则添加夏令时,请重新编写解决方案2以支持夏令时< / p>
客户端代码以更新时区名称:
$.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);