CalendarExtender indica que se ha seleccionado una date incorrecta, posiblemente relacionada con la zona horaria

Tengo una página con un TextBox y un CalendarExtender que se supone que me permite detectar qué date se selecciona. Sin embargo, esto informa la date que no está seleccionada.

 <asp:TextBox ID="tbEffectiveDate" runat="server" CssClass="input-small" MaxLength="10" Text='<%# Bind("NewEffectiveDate", "{0:MM/dd/yyyy}") %>'> </asp:TextBox> <ajaxToolkit:CalendarExtender ID="atkEffectiveDate" runat="server" FirstDayOfWeek="Sunday" TargetControlID="tbEffectiveDate" Format="MM/dd/yyyy" OnClientDateSelectionChanged="CheckForSunday"> </ajaxToolkit:CalendarExtender> 

Esencialmente, me estoy asegurando de que el usuario haya seleccionado un domingo, pero cuando selecciono un día en el calendar, el JavaScript dice que es un día antes. Estoy perplejo.

 function CheckForSunday(sender, args) { var selectedDate = new Date(); selectedDate = sender.get_selectedDate(); // Both of these show the date before the date was selected alert(sender.get_selectedDate()); if (selectedDate.getDay() != 0) { // not a Sunday var sunday = selectedDate; // calculated the nearest Sunday sunday.setDate(selectedDate.getDate() - selectedDate.getDay()); sender.set_selectedDate(sunday); // tell the user that the date wasn't a Sunday // and that the previous Sunday was selected. $("#must-be-sunday").modal("show"); } } 

Por ejemplo, si selecciono un domingo, como el 5 de mayo:

enter image description here

Luego, en la alert(sender.get_selectedDate()); línea alert(sender.get_selectedDate()); , muestra

enter image description here

Esto significa que el sábado 4 de mayo se seleccionará en lugar del 5 de mayo. Como en mi localidad, somos -0700 y esto se muestra 7 horas antes de la medianoche del día 5, supongo que esto tiene algo que ver con la zona horaria.

¿Alguien sabe qué puede estar causando esto y cómo solucionarlo para que no funcione con el time y solo con la date seleccionada?

Tiene razón en que el problema debido a las zonas horarias como CalendarExtender utiliza las dates UTC para cada valor de celda diaria. Si desea verificar el día de la semana seleccionado, puede usar la function Date.getUTCDay() lugar de Date.getDay() y getUTCDate() lugar de getDate() en el controller OnClientDateSelectionChanged .

Como de costumbre, después de escribir todo en una pregunta aquí, he resuelto mi problema. Esto fue de hecho debido a las zonas horarias, pero todavía es muy incómodo. Si alguien tiene una mejor solución, me encantaría escucharla.

Usando getTimezoneOffset () y la solución de ¿Cómo agregar 30 minutos a un object Date de JavaScript? , Creé un cálculo para arreglar esto.

 var selectedDate = sender.get_selectedDate(); // get the timezone offset in minutes var timeOffsetMinutes = selectedDate.getTimezoneOffset(); // Convert minutes into milliseconds and create a new date based on the minutes. var correctedDate = new Date(selectedDate.getTime() + timeOffsetMinutes * 60000); 

Esto corrigió mi problema y recibí la date necesaria.

    Intereting Posts