C# datetimeoffset未正确发回-MomentJS

C# datetimeoffset未正确发回-MomentJS,c#,jquery,html,knockout.js,momentjs,C#,Jquery,Html,Knockout.js,Momentjs,技术 敲除JS、敲除映射插件、MomentJS、SQL Server、C#Web服务 问题 通过模式弹出窗口添加时间条目,将开始时间设置为上午7:30至下午4:30。我希望无论用户处于哪个时区,情况都是如此。这看起来很好,但当我通过ajax保存结果时,它会将结果更改为11:30和20:30。它不包括时区,我觉得这是一个问题,但需要澄清。我现在只经营本地业务,所以都在东部时间 思想 我希望数据库显示7:30-4:00,还是我的想法不正确?我还需要它正确加载,目前也是这样,但我担心,如果我的服务器/

技术

敲除JS、敲除映射插件、MomentJS、SQL Server、C#Web服务

问题

通过模式弹出窗口添加时间条目,将开始时间设置为上午7:30至下午4:30。我希望无论用户处于哪个时区,情况都是如此。这看起来很好,但当我通过ajax保存结果时,它会将结果更改为11:30和20:30。它不包括时区,我觉得这是一个问题,但需要澄清。我现在只经营本地业务,所以都在东部时间

思想

我希望数据库显示7:30-4:00,还是我的想法不正确?我还需要它正确加载,目前也是这样,但我担心,如果我的服务器/数据库在芝加哥时间和用户在EST它不会正确加载回来

代码

新时间输入

控制台结果

员工工时视图模型

模态弹出窗口

客户端保存代码

self.SaveTimeEntries=函数(){
IsSaving(“时间条目”);
对于(var idx=0;idx
服务器保存代码

Aaah Javascript和日期,永远让开发人员感到困惑。我通常在数据库中以utc格式保存日期,并使用即时区域设置。在用户的时区中显示它的矩.utc(utcDateString).local().format(formatString)。嗨,Shadowfox,是的,弄明白这一点是一件痛苦的事。我把这个问题追溯到我用来选择日历和时间的图书馆。引导日期时间选择器v3。我使用的日期不是它使用的日期,所以我们都离开了。如果我有空,我会把我的发现发出去。
self.NewTimeEntry = function () {
    var today = new Date();

    console.log(moment(moment().format('MM/DD/YYYY')).add(7, 'h').add(30, 'm'));
    console.log(moment(moment().format('MM/DD/YYYY')).add(16, 'h').add(30, 'm'));

    var newEntry = {
        ID: -1,
        EmployeeID: -1,
        WorkorderID: self.WorkorderID(),
        JobDate: today,
        Description: '',
        LunchBreak: 0.5,
        StartedOn: moment(moment().format('MM/DD/YYYY')).add(7, 'h').add(30, 'm'),
        FinishedOn: moment(moment().format('MM/DD/YYYY')).add(16, 'h').add(30, 'm')
    };
    self.EmployeeHoursModal.unshift(new EmployeeHour(self, newEntry));

    ScrollToTop('#' + self.WorkorderHoursModalID() + ' .modal-body')
}
function EmployeeHour(parent, dto) {
var self = this;
dto = dto || {};
var mapping = { 'ignore': ['__type', '_type', 'type'] }

ko.mapping.fromJS(dto, mapping, self);

self.LunchBreakOptions = ko.observableArray([
    new RadioButton('No Lunch', 0, self.LunchBreak, function () { return self.LunchBreak() == 0; }),
    new RadioButton('15', .25, self.LunchBreak, function () { return self.LunchBreak() == .25; }),
    new RadioButton('30', .50, self.LunchBreak, function () { return self.LunchBreak() == .50; }),
    new RadioButton('45', .75, self.LunchBreak, function () { return self.LunchBreak() == .75; }),
    new RadioButton('1 Hour', 1, self.LunchBreak, function () { return self.LunchBreak() == 1; })
]);

self.StartedOn = ko.observable(moment(dto.StartedOn));
self.FinishedOn = ko.observable(moment(dto.FinishedOn));

self.CalculateTotal = ko.computed(function () {
    if (self.StartedOn() != null && self.FinishedOn() != null) {
        var endTime = moment.utc(self.FinishedOn()).subtract((60 * self.LunchBreak()), 'm').toDate();
        var totalTime = moment.utc(moment.utc(endTime, "DD/MM/YYYY HH:mm:ss").diff(moment.utc(self.StartedOn(), "DD/MM/YYYY HH:mm:ss"))); //.format("HH:mm");
        if (parseInt(totalTime.format('HH')) == 1) {
            return parseInt(totalTime.format('HH')) + ' Hour' + ((parseInt(totalTime.format('mm')) > 0) ? ' and ' + totalTime.format('mm') + ' minutes' : '');
        } else {
            return parseInt(totalTime.format('HH')) + ' Hours' + ((parseInt(totalTime.format('mm')) > 0) ? ' and ' + totalTime.format('mm') + ' minutes' : '');
        }
    } else {
        return 'None';
    }
});
}
self.SaveTimeEntries = function () {
    IsSaving('time entries');

    for (var idx = 0; idx < self.EmployeeHoursModal().length; ++idx) {
        var hourDTO = {
            dto: ko.toJS(self.EmployeeHoursModal()[idx])
        };

        PostDTO('/WorkorderService.asmx/SaveJobHour', hourDTO, function (obj) {
            self.EmployeeHoursModal()[idx].ID(obj.ID);
        });
    }

    SavedSuccessfully();
}