2013-02-19 45 views
7

我有下面的代碼,它可以正常工作,直到datepicker達到BST。jquery datepicker getTime not UTC

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的datepicker時間。

編輯:

從select.startdates選項的一個例子是

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

的時間可能是局部的,我會去看看DOC – 2013-02-19 16:23:02

+0

@HugoDozois - 是啊...任何想法如何,我可以「unlocalize」吧? – Tom 2013-02-19 16:25:14

+0

@Tom:[Date](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date)對象的getTimezoneOffset方法以分鐘返回偏移量。您可以使用它將本地日期轉換爲UTC。 – Martijn 2013-02-19 17:16:39

回答

2

它看起來像日期選擇不返回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功能,但你不能與Date構造函數中使用apply

如果你寧願離開你startDates陣列中的UTC,那麼你需要的日期選擇器的日期轉換爲UTC:

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

注意:選擇一個其他的這些方法,而不是兩個,或者你最終會遇到同樣的問題... :-)

0

我聽說有一些時區更新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一部分,但無法傷害。

0

基於@Martijn評論:

var offset = date.getTimezoneOffset(); 

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