我遇到了kendo datepicker的一个奇怪问题。我将其定义为:
<input data-role="datepicker" data-bind="value: selectedUser.HireDate" />
一切都在本地运行良好,但是当我将应用程序部署到Azure时,在将数据发送到服务器之前,我得到了错误的HireDate时间。
例如:如果我将datepicker设置为8/1/2016并且在我将数据发送到本地计算机上的服务器之前断开javascript函数我将获得Mon Aug 01 2016 00:00:00 GMT-0700 (太平洋夏令时) 如果我在现场进行相同的实验,我将于2016年8月1日星期一 17:00:00 GMT-0700(太平洋夏令时间)。一旦数据传递到服务器,我得到错误的日期,因为服务器添加7小时时区偏移,我最终在数据库中保存8月2日。
我的理解是,在客户端上,无论服务器位于何处,日期都应始终指向本地日期和时间。此外,datepicker应始终将小时设置为00:00:00,对吗?
那么,为什么在Azure服务器上部署站点时,kendo datapicker小部件会为用户选择增加17个小时?
对于为何发生这种情况的任何想法都受到高度赞赏。
谢谢。
答案 0 :(得分:0)
我想我发现了问题所在。显然,datepicker会保留将模型加载到窗口小部件时的任何时间值。在我的情况下,日期保存在数据库中,时间为00:00:00,当MVC将其转换为当地时间时,它变为17:00:00(太平洋标准时间-7:00)。然后,当用户更改日期选择器中的日期时,17:00:00将继续使用该日期。
我理解浏览器和服务器之间的转换,但我仍然想知道为什么datepicker小部件将小时保持在其值中。 datetimepicker应该这样做,但是datepicker应该将时间保持在00:00:00。这当然是我的看法。也许这是有原因的。听到Telerik的人精力充沛会很有意思。
感谢。
答案 1 :(得分:0)
我认为这是由于时区不同以及日期对象实际上是日期时间对象这一事实,javascript日期对象根据您当前的时区存储日期。
一旦将其发送到服务器,它将转换为UTC,反之亦然。如果您没有指定时间,则0:00作为时间传递,然后转换,就好像它被指定一样。
默认情况下,如果您创建新的Date对象而未指定任何内容,则它将使用浏览器的当前时间和时区。 但是,如果您创建一个仅包含年,月和日的新日期作为参数,它将选择00:00:00作为时间。