【问题标题】:jquery datepicker getTime not UTCjquery datepicker getTime不是UTC
【发布时间】:2013-02-19 16:18:38
【问题描述】:

在日期选择器到达 BST 之前,我有以下代码可以正常工作。

var i;
function showEventDates(date) {
  for (i = 0; i < startDates.length; i++) {
    if (date.getTime() == startDates[i]) {
      return [true, 'eventDay'];
    }
  }    
  return [false, ''];
}
var startDates = new Array();

$("select.startdates").find("option").each( function() {
  startDates.push(Date.UTC.apply(Date, this.value.split(",").map(Number)));
});

$('#mydate').datepicker({
    beforeShowDay: showEventDates
});

在 BST 期间,if (date.getTime() == startDates[i]) { 行返回 false,因为有一个小时的差异。

有什么想法可以让这些匹配吗?我认为日期选择器时间不是 UTC。

编辑:

select.startdates 中的一个选项示例是

<option value="2013, 2, 1">01/03/2013</option>

【问题讨论】:

  • 时间可能会本地化,我去看看文档
  • @HugoDozois - 是的......知道如何“取消本地化”它吗??
  • @Tom:Date 对象的getTimezoneOffset 方法以分钟为单位返回偏移量。您可以使用它将本地日期转换为 UTC。
  • @Martijn:听起来不错。我现在看到这个已经炸了我的大脑。你能告诉我如何使用它吗?

标签: javascript jquery jquery-ui jquery-ui-datepicker utc


【解决方案1】:

看起来日期选择器不返回 UTC 日期,而是本地日期(这实际上是 Javascript 中的默认值)。

将您构建的日期转换为当地时间:

$("select.startdates").find("option").each( function() {
  var d = Date.UTC.apply(Date, this.value.split(",").map(Number));
  d = d + new Date(d).getTimezoneOffset() * 60000; // convert UTC to local
  startDates.push(d);
});

通常,我会使用 new Date(year, month, day) 构造函数而不是 Date.UTC 函数,但您不能将 applyDate 构造函数一起使用。

如果您希望将 startDates 数组保留为 UTC,那么您需要将 datepicker 的日期转换为 UTC:

function showEventDates(date) {
  date = date - new Date(date).getTimezoneOffset() * 60000; // convert local to UTC
  // for ...
}

注意:选择一个这些方法中的一个,不要同时选择两者,否则你最终会遇到同样的问题...:-)

【讨论】:

    【解决方案2】:

    我听说 jQuery datetimepicker 有一些时区更新,所以您可能需要先检查该网站,但这是我以 UTC 格式获取所选日期和时间的方法。

    首先创建 datetimepicker 并使用城市而不是 +0500 GMT,因为如果您使用 GMT 偏移量,您必须考虑夏令时 - 这是一场噩梦。

     // create ye datetimepicker with timezone options 
     $('#datetimepicker').datetimepicker({
        showTimezone: true,
        onSelect: onSelect,
        timezoneList: [
          { value: 'America/New_York', label: 'New York'},
          { value: 'America/Chicago', label: 'Chicago' } ,
          { value: 'America/Denver', label: 'Denver' },
          { value: 'America/Los_Angeles', label: 'Los Angeles' }
        ]);
    

    接下来,从mde on Github 获取 timezoneJS.Date 库(注意:您还需要下载适合您所在地区的时区文件,只需按照 README 说明进行操作)

    现在当用户选择一个日期时,onSelect 方法就会被调用。

    function onSelect(dateText, dateInst) {
      // get the date without the timezone data
      var d = $('#datetimepicker').datepicker('getDate');
    
      // init timezoneJS
      timezoneJs.timezone.zoneFileBasePath = '/tz';
      timezoneJs.timezone.init();
    
      // get the selected timezone
      var tz = $('#datetimepicker').data('datepicker').settings.timepicker.timezone
    
      // construct the utcDate with the help of the timezoneJS.Date lib
      var utcDate = new timezoneJS.Date(
        d.getFullYear(),
        d.getMonth(),
        d.getDate(),
        d.getHours(),
        d.getMinutes(),
        tz)
      var utcLinuxTimestamp = utcDate.getTime() / 1000    
    }
    

    并非完全无痛,但它会为您处理夏令时。

    使用 UTC 时间戳中的日期和时区填充 datetimepicker 的反面如下所示:

    // init timezone JS
    timezoneJs.timezone.zoneFileBasePath = '/tz';
    timezoneJs.timezone.init();
    
    // get timezone date JS object
    var tz = 'America/New York';
    var d = new timezoneJS.Date( timestamp * 1000, tz);
    
    $('#datetimepicker').datetimepicker({
      showTimezone: true,
      timezoneList: [ 
          { value: 'America/New_York', label: 'New York'},
          { value: 'America/Chicago', label: 'Chicago' } ,
          { value: 'America/Denver', label: 'Denver' },
          { value: 'America/Los_Angeles', label: 'Los Angeles' }
        ],
      timezone: tz,
      defaultDate: d._dateProxy,
      onSelect: onSelect
    }).datepicker('setDate',d._dateProxy);
    

    我不确定你是否需要最后一行的 setDate 部分,但不会有什么坏处。

    【讨论】:

      【解决方案3】:

      基于@Martijn 评论:

      var offset = date.getTimezoneOffset();
      
      if (date.getTime() - offset == startDates[i]) 
      {
            return [true, 'eventDay'];
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-05
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 2017-10-13
        • 2010-11-15
        相关资源
        最近更新 更多