7

我有以下代码可以正常工作,直到日期选择器达到 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>
4

3 回答 3

2

看起来 datepicker 不返回 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 ...
}

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

于 2013-02-20T12:06:49.840 回答
1

我听说 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' }
    ]);

接下来,从Github 上的 mde获取 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 部分,但不会受到伤害。

于 2013-05-03T20:19:45.193 回答
0

基于@Martijn 评论:

var offset = date.getTimezoneOffset();

if (date.getTime() - offset == startDates[i]) 
{
      return [true, 'eventDay'];
}
于 2014-11-28T00:41:04.613 回答