Quick code post – We’re working with a client who needs to be able to select imprecise dates – either an exact date, the month and year, or just the year. Most date pickers aren’t set to handle this case, and I didn’t really want to write one from scratch.
We were already using the JQuery Datepicker so with some Javascript magic, I turned it into a DatePicker with Month and Year.
First, I created a method to register a Date Picker, since we have them in many places:
function registerDatePicker(element) {
$(element).datepicker({
changeMonth: true,
changeYear: true,
yearRange: 'c-100:c+10',
beforeShow: function(input, inst) { setDateFromString(input); }});
$(element).focus(function() {
$(this).datepicker('show');
if( $(this).datepicker('widget').find('tr#month-year-select').length == 0 ) {
var tbody = $(this).datepicker('widget').find('tbody');
tbody.prepend('<tr id="month-year-select"><td colspan="3" align="center"><p class="ui-state-default" id="datepicker-month-select">Select Month</p></td><td><p> </p><td colspan="3" align="center"><p id="datepicker-year-select" class="ui-state-default">Select Year</p></td></tr>');
tbody.find('#datepicker-year-select').click(function() { pushYear(element) });
tbody.find('#datepicker-month-select').click(function() { pushMonthYear(element); });
}
});
}
Notice that I’m adding in buttons to select the month or year right after the tbody. Because the Datepicker doesn’t actually select a date at default, or whenever you change the month or year, the following methods make the right thing happen:
function pushMonthYear(element) {
var shortMonthString = $('.ui-datepicker-month option:selected').text();
var monthNames = $(element).datepicker("option", "monthNames")
var shortMonthNames = $(element).datepicker("option", "monthNamesShort")
var monthString = monthNames[shortMonthNames.indexOf(shortMonthString)];
var year = $('.ui-datepicker-year option:selected').text();
$(element).val(monthString + " " + year);
$(element).datepicker("hide");
}
function pushYear(element) {
var year = $('.ui-datepicker-year option:selected').text();
$(element).val(year);
$(element).datepicker("hide");
}
Finally, because we want it to go to the right screen whenever there is something already in the box, there’s this method, called beforeShow:
function setDateFromString(element) {
var dateString = $(element).val();
var createdDate = null;
//Input element has '1994'
if(dateString.length == 4) {
createdDate = new Date(dateString, 1, 1, 0, 0, 0);
$(element).val("1/1/" + dateString);
//Input element has 'September 1994'
} else if (dateString.split(' ').length == 2) {
var splitDate = dateString.split(' ');
var monthString = splitDate[0];
var year = splitDate[1];
var month = $(element).datepicker("option", "monthNames").indexOf(monthString) + 1;
$(element).val(month + "/1/" + year);
}
}
Viola! A bit hackish, but it works well.

1 thought on “JQuery Datepicker – Selecting just Month or Year”
Comments are closed.