迁移到托管环境时的DateTime问题

时间:2014-12-23 18:31:47

标签: asp.net sql-server vb.net datetime azure

我有以下代码

    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的字段,并将该组件放在服务器上。 ..这应该可以防止转换和时区问题。

1 个答案:

答案 0 :(得分:0)

你应该从DateTimeKind.Local切换到DateTimeKind.Utc以避免像这样的惊喜。

小时差异源于您的服务器位于与模拟器不同的时区。

通常,您应该在存储之前将本地时间转换为Utc次,然后在显示之前立即将存储的Utc时间转换为本地时间。并习惯于在数据库中查看Utc次数的原始数据。 : - )