我有 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>