2013-02-19 12 views
7

Ich habe den folgenden Code, der gut funktioniert, bis der Datepicker BST erreicht.jquery datepicker getTime nicht 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 
}); 

Während BST die Zeile if (date.getTime() == startDates[i]) { gibt false zurück, weil es eine Stunde Unterschied gibt.

Irgendwelche Ideen, wie ich diese zusammenbringen kann? Ich denke, es ist die Datumszeit, die nicht UTC ist.

EDIT:

Ein Beispiel für eine Option aus select.startdates ist

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

Die Zeit lokalisiert werden kann, werde ich –

+0

@HugoDozois im doc gehen sehen - Ja ... eine Idee, wie ich kann "unlocalize" it ?? – Tom

+0

@Tom: Die 'getTimezoneOffset'-Methode des [Date] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date) -Objekts gibt den Offset in Minuten zurück. Damit können Sie ein lokales Datum in UTC umwandeln. – Martijn

Antwort

2

Es ist wie die Datepicker sieht nicht zurück UTC stammt, aber auf lokaler Ebene (die in Javascript tatsächlich ist die Standardeinstellung).

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

Normalerweise würde ich verwenden, um die new Date(year, month, day) Konstruktor anstelle der Date.UTC Funktion, aber Sie können apply nicht mit dem Date Konstruktor verwenden:

Um Ihre konstruiert Daten Ortszeit zu konvertieren.

Wenn Sie lieber Ihre Startdaten Array in UTC verlassen, dann müssen Sie die Datumsauswahl des Datums UTC konvertieren:

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

NB: Wählen Sie eine oder die andere dieser Methoden, nicht beide, oder du wirst mit dem gleichen Problem enden ... :-)

0

Ich habe gehört, dass es einige Zeitzonenupdates für den jQuery datetimepicker gibt, also könntest du die Seite zuerst überprüfen wollen, aber hier ist, was ich getan habe, um das zu bekommen Ausgewähltes Datum & Uhrzeit im UTC-Format.

Erstellen Sie zuerst datetimepicker und verwenden Sie Städte anstelle von +0500 GMT, denn wenn Sie GMT-Offsets verwenden, müssen Sie die Sommerzeit berücksichtigen - und das ist ein Albtraum.

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

Als nächstes greifen die timezoneJS.Date Bibliothek von mde on Github (Hinweis: Sie werden auch die entsprechenden Zeitzone-Dateien für Ihre Region herunterladen müssen, folgen Sie einfach den Anweisungen README)

Nun, wenn der Benutzer eine auswählt Datum, an dem die Methode onSelect aufgerufen wird.

Nicht gerade schmerzlos, aber es kümmert sich um das Tageslicht sparen Sachen für Sie.

die Rückseite dieses einen Datetimepicker mit einem Datum und einer Zeitzone von einem UTC-Zeitstempel zu bevölkern wie folgt aussieht:

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

Ich bin nicht sicher, ob Sie den setDate Teil in der letzten Zeile benötigen, aber konnte nicht weh tun.

0

basierend auf @Martijn Kommentar:

var offset = date.getTimezoneOffset(); 

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