При использовании jquery datepicker, как правильно обращаться с людьми, печатающими даты в разных форматах?
У меня есть следующий код:
$('#MilestoneStartDate').datepicker({
dateFormat: 'dd M yy'
});
и все работает отлично, если вы используете мышь, чтобы щелкнуть по дате во всплывающем окне, чтобы ввести дату, но если человек вводит дату или вставки даты в текстовое поле в другом формате, чем указано выше (например, "1/1/2016" ), когда у меня есть этот код:
var startDate = $('#MilestoneStartDate').datepicker("getDate");
переменная startDate отображается как текущая дата (хотя, очевидно, 1/1/2016 не является текущей датой)
Каков наилучший способ справиться с этими ситуациями? Должен ли я мешать людям печатать и вставлять даты или есть способ сделать преобразование формата?
Ответы
Ответ 1
getDate метод datepicker возвращает тип даты, а не строку.
Вам нужно отформатировать возвращаемое значение в строке, используя формат даты. Использовать функцию datepicker formatDate:
var startDate = $('#MilestoneStartDate').datepicker('getDate');
$.datepicker.formatDate('dd M yy', startDate);
Полный список спецификаторов формата доступен здесь.
ИЗМЕНИТЬ
$('#MilestoneStartDate').datepicker("getDate");
Всегда указывайте правильную дату, если дата выбрана мышью, чтобы щелкнуть по всплывающему окну даты, но если кто-то вручную пишет или вставляет дату в другом формате, это дает вам текущую дату.
Итак, чтобы справиться с этой ситуацией, используйте следующий код.
$(function(){
$('#MilestoneStartDate').datepicker({
dateFormat: 'dd M yy'
});
});
var strSelectedDate = new Date($('#MilestoneStartDate').val());
var formatedDate = $.datepicker.formatDate('dd M yy', strSelectedDate);
alert(formatedDate);
Рабочая демонстрация
Согласно комментарию @Boris Serebrov
Ключ new Date ($ ('# MilestoneStartDate'). val()) - он фактически пытается "угадать" формат, поэтому такие вещи, как "2 марта 2016 года", "Марш 2 2016" или "2016, 2 марта" будут правильно проанализированы.
Шаг за шагом:
Случай 1:
Здесь strSelectedDate
укажите дату в стандартном формате, скажем, если я выберу 02 Mar 2016
из всплывающего окна даты, она даст
Ср Мар 02 2016 00:00:00 GMT + 0530
Теперь
$.datepicker.formatDate('dd M yy', strSelectedDate);
укажите дату вашего формата, например, ниже.
02 марта 2016 г.
Случай: 2
Как вы упомянули в своем вопросе, если пользователь вручную вводит дату, например, 1/1/2016 strSelectedDate
дает вам стандартную дату, например, ниже.
Пт Янв 01 2016 00:00:00 GMT + 0530
Тогда
$.datepicker.formatDate('dd M yy', strSelectedDate);
предоставит вам фальшивую дату
01 января 2016 г.
Какая правильная дата, как ожидалось.
Случай 3:
Теперь, если пользователь пишет некорректную дату вручную, как 112016
, а затем strSelectedDate
возвращает Invalid Date
, поэтому здесь вы можете выполнить некоторую проверку на стороне клиента, чтобы ввести правильную дату.
Надеюсь, это поможет вам.
Ответ 2
Короткий ответ: пусть пользователь исправляет свои ошибки (вы можете разрешить вставку, это не проблема). Просто придерживайтесь простого механизма проверки.
Длинный ответ:
Я считаю, что вы должны разрешить пользователям вставлять текст,
но нет смысла проверять форму до тех пор, пока все элементы управления не будут действительны.
Итак, если пользователь вставляет ошибочную дату в свой элемент управления датой, тогда, когда она нажимает кнопку отправки, ваш ui должен отображать сообщение об ошибке: "дата не имеет правильного формата. dd M yy".
Помните, что пользователь действительно может вставить что угодно, даже такую строку, как "izeoif zoi"; так что вам НЕОБХОДИМО проверять валидацию.
Когда пользователь является виновником, она должна исправить свои ошибки (я полагаю).
Очень часто сообщать пользователю, что элемент управления ошибочен: например, я предполагаю, что вы знаете это сообщение об ошибке: "Имя требуется".
Это та же идея здесь.
Как отметил @Eric Guan, вы можете использовать подсказки, чтобы помочь пользователю получить представление о вашем формате даты в первую очередь (прежде чем она набирает/вставляет что-либо).
Ответ 3
Собственно, что нужно сделать, было бы сообщить пользователю, какой формат даты ожидается и будет действительным для ввода.
Это считается хорошим UX и так часто используется, что большинство пользователей его ожидали.
Кроме того, вы не можете разбирать все введенные даты, например, некоторые страны используют MM/DD/YYYY
, а другие используют DD/MM/YYYY
, и кто скажет, если 01/07/2015
является седьмым января или первым июлем, просто невозможно сказать, не зная формат.
Поскольку вы используете jQuery UI, здесь быстрый способ проверить датупиксера с помощью встроенного виджета Tooltip
$('#MilestoneStartDate').datepicker({
dateFormat: 'dd M yy'
}).on({
change : function() {
if ( !this.checkValidity() ) {
$(this).tooltip({
close: function( event, ui ) { ui.tooltip.stop() }
});
setTimeout(function(x) { $(x).tooltip('open') }, 0, this);
} else {
$(this).tooltip('destroy');
}
}
}).datepicker('setDate', new Date());
.ui-datepicker{ z-index: 999999999!important;}
.ui-tooltip-content {font-size: 14px;}
<link href="https://code.jquery.com/ui/1.11.4/themes/trontastic/jquery-ui.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>
<p>Type an invalid date</p>
<input id="MilestoneStartDate" pattern="[0-9]{2}\s[a-zA-Z]{3}\s[0-9]{4}" title='valid format is : "10 Mar 2015"' >
Ответ 4
Вы можете отключить текстовое поле от людей для редактирования и поместить значок рядом с ним. Люди должны нажать на значок и ввести дату. Таким образом, копия пасты не будет работать здесь.
Ответ 5
Валидация - хорошая идея.
Также вы можете написать свой собственный плагин для изменения форматов дат или посмотреть на это:
https://plugins.jquery.com/formatDateTime/
Ответ 6
Лучше запретить пользователю вводить или вставлять даты. Сделайте свое текстовое поле даты только с помощью readonly='readonly'
Ответ 7
Вы можете изменить дату пользователя на действительную дату, когда пользователь заканчивает вводить дату,
Функция будет поддерживать каждый формат:
-
дм-гг или дм-гггг
-
д/м/гг или д/м/гггг
-
dmyy или dmyyyy
будет отображаться как дм-гггг
//initializing the datePicker
$('#datePickerId').datepicker ({
format: 'dd-mm-yy',
shortYearCutoff: 0,
autoclose: true,
todayHighlight: true,
})
//change to the correct format
$('#datePickerId').datepicker()
.on("hide", function(e) {
var temp=e.delegateTarget.firstElementChild.value.split('-');
if(temp.length==3 && temp[2].length<=3)
{
var year;
if(temp[2].length==2)
year="20";
else if(temp[2].length==3)
year="2";
else year="200";
$(e.delegateTarget).datepicker("setDate", new Date(temp[1]+'-'+temp[0]+'-'+year+temp[2]));
e.delegateTarget.firstElementChild.value=temp[0]+'-'+temp[1]+'-'+year+temp[2];
}
});