Daterangepicker / Moment JS - 错误的时间戳

时间:2017-10-09 15:51:53

标签: jquery momentjs daterangepicker bootstrap-daterangepicker

我现在已经在这一段时间里摸不着头脑了。我在UI的前端使用daterangepicker.js(http://tamble.github.io/jquery-ui-daterangepicker/)。我的实现非常基础,可以在下面找到。问题是每当我使用moment.unix()转换扩展时间时,时间戳会在输入日期前一小时返回

<script type="text/javascript">
    $("#date-range").daterangepicker({
        datepickerOptions : {
            numberOfMonths : 1,
        },
        presetRanges: [{
           text: 'Last 7 Days',
           dateStart: function(){return moment().subtract('days', 7)},
           dateEnd: function() { return moment() }
        },{
           text: 'Last 30 Days',
           dateStart: function(){return moment().subtract('days', 30)},
           dateEnd: function() { return moment() }
        },{
           text: 'Last 3 months',
           dateStart: function(){return moment().subtract('days', 90)},
           dateEnd: function() { return moment() }
        },{
           text: 'Last 6 months',
           dateStart: function(){return moment().subtract('days', 180)},
           dateEnd: function() { return moment() }
        },{
           text: 'This Year',
           dateStart: function(){return moment().startOf('year')},
           dateEnd: function() { return moment() }
        }],
        change:function(event, data){

            // gets inputted dates
            var inputData = $('#date-range').daterangepicker('getRange');

            console.log(inputData);

            // formats dates into unix time stamps
            var start = moment(inputData.start).unix();
            var end   = moment(inputData.end).unix();

            console.log(start);

            // get current URL of the page (without query string)
            var currentUrl = location.protocol+'//'+location.host+location.pathname;

            // create new url
            var newUrl = currentUrl+'?start='+start+'&end='+end;

            // redirect to new URL
            //window.location.href = newUrl;
        }
    });
</script>

一个例子输出就在这里:你可以看到传递到我的时刻的开始标记js是2017年10月2日星期一午夜(这是正确的,反映了我在UI中选择的内容)

开始时间:2017年10月2日星期一00:00:00 GMT + 0100(GMT日光时间){}

当我使用

var start = moment(inputData.start).unix();

它转换为1506898800,反映在10/01/2017 @ 11:00 pm(UTC)

我试过片刻()。utc()。

这里有指针吗?

PS我知道我可以在时间戳上添加3600但不希望这样做,因为我确定我错过了一些相对简单的东西。

由于

1 个答案:

答案 0 :(得分:1)

首先,Mon Oct 02 2017 00:00:00 GMT+0100 (GMT Daylight Time)等于 转换为UTC时Sun Oct 01 2017 23:00:00 GMT+0000 (UTC)

秒,.unix()将返回1970年相对于 UTC时间的秒数。时间戳没有时区。

解决方案是将时区固定为指定的时区,并使用最安全的时区(UTC,无DST开关)。为此,请尝试在页面中包含moment-timezone并在初始化datepicker之前运行此代码一次:

moment.tz.setDefault("UTC"); 

这样,您的所有日期都将与unix时间戳兼容。