我有以下代码
Function SaveSession(ByVal model As ViewModelTrainingSession) As JsonResult
...
...
ses.Date = New DateTime(model.Date.Year, model.Date.Month, model.Date.Day, 0, 0, 0, 0, DateTimeKind.Local)
db.TrainingSessions.Add(ses)
db.SaveChanges()
当我运行此代码本地(使用调试)时,让我们说,2014,12,24 ...我的数据库中保存的日期是2014-12-24 00:00:00.000,其中是我想要的。
现在当我发布我的代码服务器(共享主机)时,相同的代码最终会将2014-12-23 00:00:00.000放在数据库中。
之前我使用的是Azure数据库,一切运行良好。现在,我在我托管的新服务器上使用数据库。代码没有改变。但我现在得到那个日期转换让我感到困惑。只有从已发布的代码运行时才能获得该日期差异。当我在本地调试模式下运行(但远程连接到de)时我没有问题
有什么想法吗?
更新
这是我在客户端做的事情
bSoft.AjaxSaveSession = function (model) {
/* Convert it to JSON and send it to controller */
var json = ko.toJSON(model);
var targetURL = DataSrvOptimaxUrl + '/' + 'SaveSession';
bSoft.globals.vm.showLoadingWheel(true);
$.ajax({
url: targetURL,
type: "POST",
contentType: 'application/json; charset=utf-8',
模型包含各种字段,但其中两个名为Date和DateStart,它们填充了javascript日期(我使用XDate)
使用您看到的Ajax Call将模型发送到服务器。
另一方面(服务器端),我有一个用VB.NET定义的ViewModel(ViewModelTrainingSession)。同样,该模型包含一堆属性,其中两个是Date和DateStart ...
ASP.NET执行了一些魔术,该字段根据字段名称从JSON转换为VB。
Function SaveSession(ByVal model As ViewModelTrainingSession) As JsonResult
If ModelState.IsValid Then
Try
'....
'Make sure date is save using time of 00.00.00:000
ses.StartTime = New DateTime(model.Date.Year, model.Date.Month, model.Date.Day, 0, 0, 0, 0, DateTimeKind.Local)
ses.Date = New DateTime(model.Date.Year, model.Date.Month, model.Date.Day, 0, 0, 0, 0, DateTimeKind.Local)
'...
db.TrainingSessions.Add(ses)
db.SaveChanges()
我认为日期在从JSON到VB的转换中搞砸了。这不是数据库的问题。
我想我会尝试发送日期组件而不是日期,我会在被叫日的被叫月份上有一个名为year的字段,并将该组件放在服务器上。 ..这应该可以防止转换和时区问题。
答案 0 :(得分:0)
你应该从DateTimeKind.Local切换到DateTimeKind.Utc以避免像这样的惊喜。
小时差异源于您的服务器位于与模拟器不同的时区。
通常,您应该在存储之前将本地时间转换为Utc次,然后在显示之前立即将存储的Utc时间转换为本地时间。并习惯于在数据库中查看Utc次数的原始数据。 : - )