2013-05-08 1 views
4

У меня есть страница с TextBox и CalendarExtender, которая должна позволить мне определить, какая дата выбрана. Тем не менее, это сообщение о дате, которая не выбрана.CalendarExtender, указав неправильную дату, возможно, связанную с часовым поясом

<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> 

По существу я убедившись, что пользователь выбрал в воскресенье, но когда я выбираю день на календаре JavaScript говорит, что это за день до того. Я недоумеваю.

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

Например, если выбрать в воскресенье, например, 5 мая:

enter image description here

Затем на линии alert(sender.get_selectedDate());, он отображает

enter image description here

Это говорит Суббота, 4 мая выбирается вместо 5 мая. Поскольку в моей локали мы -0700, и это показывает 7 часов до полуночи на 5-м, я предполагаю, что это имеет какое-то отношение к часовому поясу.

Кто-нибудь знает, что может быть причиной этого и как его исправить, чтобы он не работал со временем и выбрана только выбранная дата?

ответ

2

Вы правы, что проблема из-за часовых поясов, поскольку CalendarExtender использует даты UTC для каждого значения ячейки дня. Если вы хотите проверить выбранный день недели, вы можете использовать функцию Date.getUTCDay() вместо Date.getDay() и getUTCDate() вместо getDate() в OnClientDateSelectionChanged обработчике.

4

Как обычно, после того, как я написал все в вопрос, я решил свою проблему. Это было действительно из-за часовых поясов, но все еще очень неудобно. Если у кого-то есть лучшее решение, я бы хотел это услышать.

Используя getTimezoneOffset() и решение от How to add 30 minutes to a JavaScript Date object?, я создал расчет, чтобы исправить это.

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

Это исправило мою проблему, и я получил нужную дату.

Смежные вопросы