【问题标题】:Daterangepicker / Moment JS - Wrong timestampDaterangepicker / Moment JS - 错误的时间戳
【发布时间】:2018-03-20 21:32:15
【问题描述】:

我已经为此苦苦思索了一段时间。我在 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,反映 2017 年 10 月 1 日下午 11:00(UTC)

我试过 moment().utc()。

这里有什么建议吗?

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

谢谢

【问题讨论】:

  • 请注意1506898800 等于2017-10-01T23:00:00 UTC2017-10-02T00:00:00+0100 相同。
  • @VincenzoC 如何让 Moment JS 返回此结果。我试过moment.local()。只是将 3600 添加到时间戳的唯一方法吗?
  • 抱歉,我不明白您的预期结果是什么。如果您想将 inputData.start 解析为 UTC,请使用 moment.utc
  • 嗨@VincenzoC,当用户选择开始时:Mon Oct 02 2017 00:00:00 GMT+0100 (GMT Daylight Time) {} in datepicker js。我希望返回的 unix 时间戳反映 10 月 2 日星期一而不是 10 月 1 日星期日 @ 23:00。我也尝试过 .utc,但日期在 23:00 时一直返回为第一天

标签: jquery momentjs daterangepicker bootstrap-daterangepicker


【解决方案1】:

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

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

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

moment.tz.setDefault("UTC"); 

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

【讨论】:

    猜你喜欢
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多