2012-03-01 11 views
33

La data restituita dalla selezione data è disattivata di un giorno. È un problema nel mio codice o è un bug?datepicker data off di un giorno

La data inviata a date_picker è 2012-03-21. La data restituita da datepicker è Gio Mar 20 2012.

var end_date = end_calendar.getFormatedDate("%Y-%m-%d"); 
    end_date = $.datepicker.formatDate('D M dd yy', new Date(end_date)); 
+0

Sei sicuro che questo è collegato a DatePicker? 'document.write (new Date ('2012-03-21'))' prints 'mar 20 mar 2012 20:00:00 GMT-0400 (Eastern Daylight Time)' per me. Bug anno bisestile? –

+0

Anche con la formattazione, controlla questo: http://jsfiddle.net/fkSC5/ Passare a '2012-03-21' e' 2012/03/21' a 'Date()' fornisce risultati che sono 4 ore di distanza. –

+0

È vero. new Date ('...') è disattivato di un giorno. – user823527

risposta

16

Sembra un bug. Se la stringa inviata a Date() è formattata come 2012/03/21 anziché 2012-03-21. La data sembra giusta.

+0

grazie @ user823527 – Sohail

0

controllare l'ortografia di .getFormatedDate e modificarlo .getFormattedDate è un cambiamento banale, ma modificarlo e vedere se eventuali risultati di fissaggio.

21

Non è la DatePicker,

console.log(new Date('2012-03-21')); //prints Tue Mar 20 2012 20:00:00 GMT-0400 (Eastern Daylight Time) 

L'oggetto JavaScript Date può accettare una delle seguenti sintassi di seguito,

  1. new Date()
  2. new Date (millisecondi)
  3. new Date (dateString)
  4. new Data (anno, mese, giorno [, ora, minuto, secondo d, millisecondo])

Quindi nel tuo caso chiamerà la dataString e parse. Quindi provare aggiungendo il tempo come qui sotto,

new Date ('2012-03-21T00:00:00') //should return you Wed Mar 21 2012 

DEMO

o Meglio usare come sotto,

new Date (2012, 2, 21). 

anno - Valore intero che rappresenta l'anno. Per compatibilità (al fine di evitare il problema Y2K), è necessario specificare sempre l'anno per intero; utilizzare 1998, anziché 98.

mese - Valore intero che rappresenta il mese, a partire da 0 per gennaio a 11 per dicembre.

giorno - Valore intero che rappresenta il giorno del mese (1-31).

+1

Riesci a far luce sui miei commenti sopra? Perché 'new Date ('2012-03-21)' restituisce una data che ha il tempo di forma '20: 00: 00' ed è il giorno sbagliato, come dichiari nella prima riga del tuo post? –

+2

@ Madadigan Sto cercando di capire la stessa cosa. Sembra che la nuova data ('2012-03-21T00: 00: 00') restituisca lo stesso risultato della nuova data ('2012/03/21'). Tuttavia non ho alcuna spiegazione se si utilizza/default ora 00:00:00 –

+0

si potrebbe prendere in considerazione http://stackoverflow.com/a/33494882/533426 – Toskan

11

È possibile aggiungere la differenza alla data che ignorerà essenzialmente il fuso orario.

d.setTime(d.getTime() + d.getTimezoneOffset()*60*1000); 
+0

grazie l'aiuto della risposta qui http://stackoverflow.com/questions/32469269/javascript-date-give-wrong-date-off-by-one -ora uso solo meno '-' e uso l'ora corrente per ottenere l'offset del fuso orario come questo' d.setTime (d.getTime() - new Date(). getTimezoneOffset() * 60 * 1000); ' – Youssef

7

Non so perché questo funziona, ma quello che ho trovato è se si utilizzano barre oblique o trattini influisce sulla risposta. Guarda.

new Date ('2012/03/21'); // returns: "Wed Mar 21 2012 00:00:00 GMT-0500 (CDT)" 
new Date ('2012-03-21'); // returns: "Tue Mar 20 2012 19:00:00 GMT-0500 (CDT)" WHA! 

Quindi, per risolvere il mio problema ho fatto una semplice espressione regolare sulla mia data di ingresso per sostituire sempre i primi tre trattini con le barre.

var strInputValue = control.value, // <-- get my date string 
    dteCurrent; 

strInputValue = strInputValue.replace(/-/, '/') // replace 1st "-" with "/" 
          .replace(/-/, '/'); // replace 2nd "-" with "/" 

dteCurrent = new Date(strInputValue); 

Ho fatto un molto veloce ricerca su Google per il motivo per cui questo sarebbe accaduto e nessuna risposta. Ma questo dovrebbe risolvere il tuo problema. Tutto quello che devi fare è sostituire i trattini con le barre in avanti prima di passarli dove vuoi.

Modifica: scusate non ho notato la risposta già accettata prima di postare, per favore ignorate questa risposta.

+0

One del commento della domanda spiega correttamente perché questo è il caso. La differenza di formato sembra dettare data per assumere alcuni valori come zero in UTC, che non è il caso quando si utilizzano le barre in avanti – fayyazkl

+0

non funziona per me. anche se sostituisco - con /, l'output è lo stesso .. – amidstCloud

4

Sta accadendo a causa della differenza di fuso orario con la data Formato- aaaa-mm-gg

new Date ('2015/07/10'); // returns: "Fri Jul 10 2015 00:00:00 GMT-0700 (Pacific Daylight Time)" 

new Date ('2012-07-10'); // returns: "Thu Jul 09 2015 17:00:00 GMT-0700 (Pacific Daylight Time)" 

yyyy/mm/dd - non sta considerando fuso orario, mentre il calcolo time.But locale
yyyy-mm-dd - sta prendendo in considerazione il tempo durante il calcolo locali tempo nella funzione di data di script java.
Questo può essere riproducibile quando i fusi orari del client (browser) e del server sono diversi e hanno una differenza di fuso orario/data di 1 giorno.

Puoi provare questo sul tuo computer cambiando il tempo in diversi fusi orari in cui il tempo b/w dovrebbe essere> = 12 ore.

0

Non ho la reputazione di commentare, ma Venu M mi ha dato una buona intuizione. Il mio progetto ha lo stesso problema in cui, a seconda della sintassi della mia immissione di data, la data ritorna come input o off un giorno. Espandendo e guardando il formato di data intera, i miei diversi formati di data di input tornano in UTC o nel fuso orario locale, a seconda della sintassi. Sto usando Moment JS per analizzare le mie date e quindi restituire un oggetto data per la convalida con Breeze. Ho sia un modale di input o una tabella in cui modificare, quindi ora ho bisogno di assicurarsi che entrambi siano analizzati e convalidati in modo identico. Suggerisco di verificare che l'oggetto data sia stato creato nello stesso modo, indipendentemente dalla sua sintassi di input o dalla posizione di input.

1
var myDate = $.datepicker.parseDate("yy-mm-dd", "2013-10-21"); 
..//do whatever with myDate now 
0

Dopo aver riscontrato lo stesso problema e l'arrivo su questa pagina, nel mio caso si è scoperto che era causato da un'etichettatura non valida dei giorni. Ho iniziato la settimana lunedì, anziché domenica. Spero che questo aiuti qualcuno.

1

Dopo aver provato molte soluzioni il seguente codice ha funzionato per me preso da (https://stackoverflow.com/a/14006555/1736785)

function createDateAsUTC(date) { 
    return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds())); 
} 
4

maggior parte delle risposte in questa pagina sono confusi e contengono alcune mis-informazione.

Il vero problema è come l'oggetto javascript Date analizza le stringhe di data.

La risposta migliore che ho trovato è this stack-O answer. Dai un'occhiata al suo eccellente articolo.

Di seguito è riportato un commento molto pertinente dalla risposta di cui sopra. (Credito: @Mizstik)

Tutto ciò è dovuto al comportamento della Date.parse sottostante() cercando di seguire ISO 8601. Quando la stringa data segue il formato aaaa-mm-dd, da assumere pari essere ISO 8601 con implicita UTC 00:00. Quando la stringa si discosta dal formato (ad esempio mm-gg-aaaa o barra anziché trattino), torna al parser più lento secondo RFC 2822 che utilizza l'ora locale quando il fuso orario è assente. Certo, tutto questo sarà alquanto arcano per una persona media.

Problemi correlati