我有MVC 5应用程序。我有以下工作流程:
从剑道时间选择器控件中选择一个时间 - >在服务器上将该时间转换为UTC - >将UTC时间存储在数据库中 - >从DB中检索UTC时间 - >将它绑定回时间选择器控件
服务器的时区是中央标准时间(UTC -6:00)
我有以下步骤:
1 GT;用户从Kendo Time选取器控件中选择一个时间并将其提交给服务器。例如,假设用户选择“下午6:00”
2 - ;在检查发布日期值时在服务器上,Kind属性为unspecified
。这意味着如果我将此时间转换为UTC时间,它将使用服务器的时区来抵消时间。但是我认为我们希望客户的时区能够抵消
3>所以我想到了使用Kendo time picker的value()方法,该方法以字符串格式返回Wed May 18 2016 18:00:00 GMT-0500 (Central Daylight Time)
的值。此值包含时区信息,包括日光节省
4>所以我添加了隐藏字段,在客户端我将字符串值分配给隐藏字段
5个在服务器上,我使用隐藏字段值转换为UTC并将其存储到数据库中。因此,上述值存储为UTC时间23:00:00。 (偏移量为-5)
到目前为止一切顺利
6个在其他屏幕上,我现在要向客户显示此值 7个现在,当我将此UTC时间绑定到时间选择器控件时,它显示下午5:00而不是下午6:00(即17:00:00而不是18:00:00)。这意味着它抵消了-6(即中央标准时间)。
问题:
1 GT;从时间选择器获取值时,它知道日光时区。 (正如我们在字符串中看到的那样)。但是,当我们将值设置为不考虑日光时区时。为什么?
模型
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();
}
查看:显示用户界面上的时间
<div>
@Html.Kendo().TimePickerFor(x => x.OrderTime)
.Format("hh:mm tt");
</div>