Javascript 设置日期时间显示错误的日期

Javascript 设置日期时间显示错误的日期,javascript,datetime,Javascript,Datetime,我有两个单选按钮来选择时间范围 这两个选项可用: 0:00-0:00(24小时) 6:00-6:00(24小时) 这是我的jQ函数: $('.btn-time').on('change', function() { var value = $(this).attr('data-value'); var a = new Date($('#ipDateTimeFrom').val()); var b = new Date($('#ipDateTimeTo').val());

我有两个单选按钮来选择时间范围

这两个选项可用:

0:00-0:00(24小时)

6:00-6:00(24小时)

这是我的jQ函数:

$('.btn-time').on('change', function() {
    var value = $(this).attr('data-value');
    var a = new Date($('#ipDateTimeFrom').val());
    var b = new Date($('#ipDateTimeTo').val());
    switch(value) {
        case '0':
            a.setUTCHours(0);
            a.setUTCMinutes(0);
            a.setUTCSeconds(0);
            b.setUTCHours(0);
            b.setUTCMinutes(0);
            b.setUTCSeconds(0);
            break;
        case '6':
            a.setUTCHours(6);
            a.setUTCMinutes(0);
            a.setUTCSeconds(0);
            b.setUTCHours(6);
            b.setUTCMinutes(0);
            b.setUTCSeconds(0);
            break;
    }

    $('#ipDateTimeFrom').val(a.toISOString().replace('T', ' ').replace( /\..+/g, ''));
    $('#ipDateTimeTo').val(b.toISOString().replace('T', ' ').replace( /\..+/g, ''));
});
如果我在0:00和6:00之间切换,日期会从2016-06-07 00:00:00变为2016-06-06 06:00:00,我不知道为什么。这一天没有人碰过


这里有一个工作实例来指出问题所在

发生这种情况是因为您将本地时间与UTC时间混合在一起,并且您可能生活在UTC+某个时区

更准确地说,从输入元素读取并转换为日期的字符串值被解释为本地日期/时间。但在UTC格式中,这是提前几个小时的,因此当您开始将日期截断为0:00时,一切仍然正常,但输入也会得到0:00,在UTC格式中,这是提前几个小时的,即在前一天。因此,下次执行到6:00的截断时,将是前一天的6:00

因此,您应该坚持使用UTC或本地日期进行所有操作。以下是如何将输入字符串解释为UTC,以便所有操作都使用UTC:

var a = new Date($('#ipDateTimeFrom').val().replace(' ', 'T') + 'Z');
var b = new Date($('#ipDateTimeTo').val().replace(' ', 'T') + 'Z');
// etc.

当然,这假设输入的日期/时间遵循特定格式。但你会明白的。最后的
Z
表示UTC。

要避免痛苦,请使用moment.js。它使解析和格式化变得更加容易

$('.btn-time').on('change', function() {
        var value = $(this).attr('data-value');
        var a = new Date($('#ipDateTimeFrom').val());
        var b = new Date($('#ipDateTimeTo').val());
        var newA, newB;
        switch(value) {
            case '0':
                newA = moment(a).startOf('day');
                newB = moment(b).startOf('day');
                break;
            case '6':
                newA = moment(a).startOf('day').hours(6);
                newB = moment(b).startOf('day').hours(6);
                break;
        }

        $('#ipDateTimeFrom').val(newA.format('YYYY-MM-DD HH:mm:ss'));
        $('#ipDateTimeTo').val(newB.format('YYYY-MM-DD HH:mm:ss'));
    });

Hi@trincot,谢谢你的回答。时区演员阵容运作良好:-)嗨@derp,我以前从未使用过moment.js。但它看起来真的很有趣。@nagazi Moment是一个非常直接的工具,它确实使处理日期变得更容易。但是,在将大型js文件包含到项目中之前,请务必考虑一下,如果您只需要一点点的日期工作,那么也许最好多争取几分钟,为用户节省一些加载时间:)这是一个intranet应用程序。我用了缩小的瞬间。但感谢您提供的信息:-)