Daterangepicker/Moment JS - 错误的时间戳
问题描述:
我一直在挠我的头,这一段时间了。我在我的用户界面的前端使用了daterangepicker.js(http://tamble.github.io/jquery-ui-daterangepicker/)。我的实现非常基础,可以在下面找到。问题是,每当我使用moment.unix()时间戳返回前一小时输入的日期Daterangepicker/Moment JS - 错误的时间戳
<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是周一第2个月2017年午夜(这是正确的,反映了我在UI中选择)
开始:周一至2017年10月2日00:00:00 GMT + 0100(GMT夏令时间){}
当我使用
var start = moment(inputData.start).unix();
它转换成1506898800反映了2017年10月1日@下午11:00(UTC)
我已经试过时刻()。UTC()。
任何指针?
PS我知道我可以添加3600到时间戳,但宁愿不这样做,因为我确信我错过了一些相对简单的事情。
感谢
答
首先,当转换为UTC Mon Oct 02 2017 00:00:00 GMT+0100 (GMT Daylight Time)
等于 Sun Oct 01 2017 23:00:00 GMT+0000 (UTC)
。
秒,.unix()将返回1970年的秒数,相对于UTC时间。时间戳没有时区。
解决方法是将时区固定为指定的时区,并使用最安全的时区(UTC,无DST开关)。要做到这一点,尝试包括moment-timezone页面和初始化的日期选择器前一次运行该代码:
moment.tz.setDefault("UTC");
这样,所有的日期将与UNIX兼容的时间戳。
请注意,'1506898800'等于'2017-10-01T23:00:00 UTC',即'2017-10-02T00:00:00 + 0100'。 – VincenzoC
@VincenzoC如何让JS获得这个结果。我尝试过moment.local()。将3600添加到时间戳的唯一方法是? –
对不起,但我不明白你的预期结果是什么。如果你想将你的'inputData.start'解析为UTC,请使用['moment.utc'](http://momentjs.com/docs/#/parsing/utc/)。 – VincenzoC