2013-02-19 29 views
7

Tôi có đoạn mã sau hoạt động tốt cho đến khi datepicker đạt BST.jquery datepicker getTime không phải là 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 
}); 

Trong khi BST dòng if (date.getTime() == startDates[i]) { trả về false vì có sự khác biệt một giờ.

Bất kỳ ý tưởng nào về cách tôi có thể nhận những thứ này để khớp? Tôi nghĩ rằng đó là thời gian datepicker mà không phải là UTC.

EDIT:

Một ví dụ về một tùy chọn từ select.startdates là

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

Hiện có thể được định vị, tôi sẽ đi xem xét các doc –

+0

@HugoDozois - Ừ ... bất kỳ ý tưởng làm thế nào tôi có thể "unlocalize" nó ?? – Tom

+0

@Tom: phương thức 'getTimezoneOffset' của đối tượng [Date] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date) trả về độ lệch theo phút. Bạn có thể sử dụng nó để chuyển đổi ngày địa phương thành UTC. – Martijn

Trả lời

2

Dường như datepicker không trả lại UTC ngày, nhưng những người địa phương (mà thực sự là mặc định trong Javascript).

Để chuyển đổi ngày xây dựng của bạn để theo giờ địa phương:

$("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); 
}); 

Thông thường, tôi muốn sử dụng new Date(year, month, day) constructor thay vì Date.UTC chức năng, nhưng bạn không thể sử dụng apply với các nhà xây dựng Date.

Nếu bạn muốn rời khỏi mảng startDates của bạn trong UTC, sau đó bạn cần phải chuyển đổi ngày của datepicker để UTC:

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

NB: chọn một hoặc khác của phương pháp này, không phải cả hai, hoặc bạn sẽ kết thúc với cùng một vấn đề ... :-)

0

Tôi nghe có một số cập nhật múi giờ cho bộ dữ liệu jQuery để bạn có thể kiểm tra trang web trước, tuy nhiên đây là những gì tôi đã làm để có được đã chọn ngày & thời gian ở định dạng UTC.

Trước tiên hãy tạo bảng kê dữ liệu và sử dụng thành phố thay vì +0500 GMT vì nếu bạn sử dụng bù giờ GMT, bạn phải tính đến khoản tiết kiệm ban ngày - và đó là cơn ác mộng.

// 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' } 
    ]); 

Tiếp theo, lấy các thư viện timezoneJS.Date từ mde on Github (Chú ý: bạn cũng sẽ cần phải tải về các tập tin múi giờ thích hợp cho khu vực của bạn, chỉ cần làm theo các hướng dẫn README)

Bây giờ khi người sử dụng chọn một ngày phương thức onSelect được gọi.

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  
} 

Không chính xác, nhưng nó sẽ giúp bạn tiết kiệm công cụ tiết kiệm ánh sáng ban ngày.

Điều ngược lại điều này để cư một DateTimePicker với một ngày và một múi giờ từ một UTC timestamp trông như thế này:

// 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); 

Tôi không chắc chắn nếu bạn cần một phần setDate trên dòng cuối cùng, nhưng không thể đau.

0

dựa trên nhận xét @Martijn:

var offset = date.getTimezoneOffset(); 

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