Для начала речь идет о плагине Eonasdan Bootstrap-Datetimepicker, который сейчас используется в моем текущем проекте.
В моем проекте я использовал 2 типа формата даты: defaultFormat и userFormat.userFormat используется для отображения даты в формате, который хочет пользователь.defaultFormat - это формат, который может принимать только серверная часть, и обычно это следующий формат.
DD.MM.YYYY
Выбор даты следующий:
<div class="col-xs-4 padding-sides-none noborderleft">
<div class='input-group date' id='datetimepicker' style="width:100%;" >
<input type='text' id="date" name="date" class="form-control" data-date-format="DD.MM.YYYY" style="width:100%"/>
<span class="input-group-addon">
<span class="glyphicon glyphicon-calendar"></span>
</span>
</div>
<script type="text/javascript">
$(function () {
var datepicker = $('#datetimepicker').datetimepicker();
});
</script>
</div>
Формат даты-данных, который я контролировал, когда страница впервые загружалась с использованием следующего кода (да, я использую Lodash)
function setDateFormat(){
var datepickers = $('[data-date-format]'),
dateFormat = *insert any user format here*;
_.forEach(datepickers, function(picker){
$(picker).attr('data-date-format', dateFormat);
});
}
Теперь возникает проблема.
Я хочу, чтобы при передаче данных из бэкэнда в средство выбора даты она отображала дату в соответствии с выбранным пользователем форматом.А при получении значения из средства выбора даты оно автоматически преобразует дату в формат по умолчанию.У меня есть следующие 2 фрагмента кода, которые широко используются в проекте, и редактирование этих 2 будет полной болью.
// Assuming the date from backend is 20.12.2018, and user date format is YYYY/MM/DD
$(picker).val('20.12.2018') ==> // in picker, it will show as 2018/12/20
$(picker).val() ==> // it will get the date from picker as 20.12.2018, not 2018/12/20
Поскольку я не хочу редактировать каждую строку приведенного выше кода (их сотни тысяч), поэтому я изменил метод val () исходного jQuery, чтобы выполнить преобразование
(function ($) {
var original_val = jQuery.fn.val;
jQuery.fn.val = function( value ) {
var elem = this[0], val = undefined,
standardDateFormat = 'DD.MM.YYYY',
customDateFormat = /*Any user specific format in here*/;
// *** Early exit when used as a getter
if (!arguments.length) {
if (elem){
var elementVal = elem.value;
if (elem.hasAttribute('data-date-format')){
if (elementVal === "Invalid date" || elementVal.trim() === ''){
return original_val.call(this);
} else {
return moment( original_val.call(this), customDateFormat ).format(standardDateFormat);
}
} else {
return original_val.call(this);
}
} else {
return original_val.call(this);
}
} else {
// Set for value first, if its undefined
val = value ? value : "";
if (elem){
// For any date input with data-date-format input on it
if ( elem.hasAttribute('data-date-format') ){
return original_val.call(this, moment(val).format(customDateFormat));
} else {
return original_val.call(this, val);
}
}
}
}
})(jQuery);
Но потом, после того, как я это сделал, я заметил, что это на самом деле нарушает методы установки и получения плагина.Когда я передаю дату сборщику, используя val (), например val ('20 .12.2018 '), он показывает дату точно так же, как 2018/12/20, но когда я пытаюсь изменить дату, используя календарь datepicker, датустановится совершенно другой датой, например 2011/10/01 или чем-то, что не является первоначальной датой.
Я не уверен, что с этим делать, и, конечно, я не хочу проходить каждую строку кода val (), относящуюся только к средству выбора даты.Есть ли для меня лучшее решение для преобразования даты из defaultFormat в userFormat и наоборот, без необходимости проходить сотни тысяч строк и без нарушения исходной библиотеки Eonasdan datetimepicker?
Вот jsfiddle для нее- https://jsfiddle.net/pk6gcm10/5/