0

我有 MVC 5 应用程序。我有以下工作流程:
从剑道时间选择器控件中选择一个时间->在服务器上将该时间转换为UTC->将UTC时间存储在数据库中->从数据库中检索UTC时间->将其绑定回时间选择器控件

服务器的时区是中部标准时间 (UTC -6:00)

我有以下步骤:
1> 用户从 Kendo 时间选择器控件中选择一个时间并将其提交给服务器。例如,假设用户选择“下午 6:00”<br> 2> 在服务器上,当我检查发布的日期值时,Kind 属性是unspecified。这意味着如果我将此时间转换为 UTC 时间,它将使用服务器的时区来抵消时间。但是我认为我们希望客户的时区能够抵消。
3>所以我想到了使用剑道时间选择器的 value() 方法,它将字符串格式的值返回为Wed May 18 2016 18:00:00 GMT-0500 (Central Daylight Time). 此值具有时区信息,包括夏令时。
4>所以我添加了隐藏字段,并在客户端将字符串值分配给隐藏字段。
5> 在服务器上,我使用隐藏字段值转换为 UTC 并将其存储到数据库中。因此上述值存储为 23:00:00 UTC 时间。(偏移量为-5)

到目前为止,一切都很好

6> 现在我想在其他屏幕上向客户显示这个值。
7> 现在,当我将此 UTC 时间绑定回时间选择器控件时,它显示 5:00 PM 而不是 6:00 PM(即 17:00:00 而不是 18:00:00)。这意味着它的偏移量为 -6(即中央标准时间)。

问题:
1> 从时间选择器获取值时,它知道日光时区。(正如我们在字符串值中看到的)。但是,当我们设置该值时,它不考虑日光时区。为什么?

模型

        public class Mymodel
        {       
            [DataType(DataType.Time)]        
            public DateTime OrderTime { get; set; }

            public string OrderTimeHidden { get; set; }

        }

观点:捕捉时间

        @model MyNameSpace.Mymodel

        <div>
            @(Html.Kendo().TimePickerFor(x => x.OrderTime)
            .Format("hh:mm tt")
            .Value("08:00 PM")
            .HtmlAttributes(new { onkeydown = "javascript:return false;" })
            )
            @Html.HiddenFor(x=>x.OrderTimeHidden)
        </div>

Javascript:将模型发布到服务器

submit.click(function () {
    $('#OrderTimeHidden').val($("#OrderTime").getKendoTimePicker().value());

     // do post here
     $.ajax({...})
  })

控制器:将时间转换并节省到数据库中

        [HttpPost]
        public ActionResult Save(MyModel model)
        {
            var dt = DateTime.ParseExact(model.OrderTimeHidden.Substring(0, 33), "ddd MMM d yyyy HH:mm:ss 'GMT'K", CultureInfo.InvariantCulture);

            var entity = new MyEntity();

            //OrderTime on entity is of type TimeSpan
            entity.OrderTime = dt.ToUniversalTime().TimeOfDay; 

            SaveToDataBase(entity)

            return View("SomeView");
        }

控制器:在 UI 上显示时间

        [HttpGet]
        public ActionResult ViewTime()
        {
           var entity = GetEntityFromDataBase();
           var model = new MyModel();
           model.OrderTime = new DateTime(entity.OrderTime.Ticks, DateTimeKind.Utc)
           return View();
        }

视图:在 UI 上显示时间

        <div>
         @Html.Kendo().TimePickerFor(x => x.OrderTime)
            .Format("hh:mm tt");
        </div>
4

0 回答 0