如果选择月份的第一天,日期选择器传递的日期不正确
Incorrect date passed from date picker if selecting the first of the month
这里是第一个问题所以要温和 :)
对 jquery 和日期选择器还很陌生,这个让我很困惑,所以希望有更多知识的人可以提供帮助。
基本上我有 2 个日期选择器,其中人们 select 他们接下来的 2 个发薪日期,但是如果有人 select 从日期选择器 2 (#incomeNextDate2) 开始的 2 月 1 日或 3 月 1 日那么第一个日期选择器 (#incomeNextDate1) 中的日期显示 01/01/2021 或 02/01/2021。我假设这是日期选择器 2 中的 onselect 函数的问题,但无法确定问题所在。日期选择器的 jquery 如下:
$("#incomeNextDate1").datepicker({
dateFormat: 'dd/mm/yy',
defaultDate: +4,
changeMonth: false,
minDate: 0,
maxDate: +40,
prevText: '<i class="fa fa-chevron-left"></i>',
nextText: '<i class="fa fa-chevron-right"></i>',
onSelect: function( selectedDate ) {
date1 = $('#incomeNextDate1').datepicker('getDate');
var date2 = $('#incomeNextDate1').datepicker('getDate');
date1.setDate(date1.getDate()+4);
date2.setDate(date2.getDate()+45);
$( "#incomeNextDate2" ).datepicker( "option", "maxDate", date2 );
$( "#incomeNextDate2" ).datepicker( "option", "minDate", date1 );
$('#incomeNextDate1').trigger('blur');
}
});
$("#incomeNextDate2").datepicker({
dateFormat: 'dd/mm/yy',
minDate: +4,
maxDate: +80,
changeMonth: false,
prevText: '<i class="fa fa-chevron-left"></i>',
nextText: '<i class="fa fa-chevron-right"></i>',
onSelect: function( selectedDate ) {
var days = Math.floor((new Date(selectedDate) - new Date()) / (1000*60*60*24));
$( "#incomeNextDate1" ).datepicker( "option", "maxDate", Math.min(days, 35) );
$('#incomeNextDate2').trigger('blur');
}
});
我应该补充一点,日期不可能是 01/01/2021 或 02/01/2021,因为它不应该是今天之前的日期,一旦发生这种情况,日期选择器就无法使用,因为我不能再 select 另一个日期或更改月份。
我在这里为你做了一些很酷的东西...
我定义了一些变量来轻松设置 min/max 日期。
这是在使用 moment.js,在涉及日期时我总是推荐它,因为它使日期操作更加容易。
let dp_1 = $("#incomeNextDate1");
let dp_2 = $("#incomeNextDate2");
// Min/max from today for DP_1
let minDaysFromToday = 4;
let maxDaysFromToday = 45;
// Min/max from selected date in DP_1 for DP_2
let minSeconDate = 7;
let maxSecondDate = 21;
let today = moment();
let DP1_min = today.add(minDaysFromToday, "d").format("DD/MM/yyyy");
let DP1_max = today.add(maxDaysFromToday, "d").format("DD/MM/yyyy");
console.log(`${DP1_min} - ${DP1_max}`);
dp_1.datepicker({
dateFormat: "dd/mm/yy",
minDate: DP1_min,
maxDate: DP1_max,
/* Those can only be TEXT because it is used as a title attribute. */
/* It cannot be some fontAwesome icons */
prevText: "PREVIOUS TEXT",
nextText: "NEXT TEXT",
onSelect: function (selectedDate) {
let selected = moment(selectedDate, "DD/MM/yyyy");
let DP2_min = selected.add(minSeconDate, "d").format("DD/MM/yyyy");
let DP2_max = selected.add(maxSecondDate, "d").format("DD/MM/yyyy");
console.log(`${DP2_min} - ${DP2_max}`);
// Set DP_2 min/max
dp_2.datepicker("option", { minDate: DP2_min, maxDate: DP2_max });
// Remove any DP_2 date and focus it
setTimeout(function () {
dp_2.val("").focus();
}, 100);
}
});
dp_2.datepicker({
dateFormat: "dd/mm/yy",
onSelect: function (selectedDate) {
console.log(`Selected dates are ${dp_1.val()} and ${dp_2.val()}`);
}
});
<link href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.css" rel="stylesheet"/>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.2/css/all.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<input type="text" id="incomeNextDate1"/>
<input type="text" id="incomeNextDate2"/>
这里是第一个问题所以要温和 :)
对 jquery 和日期选择器还很陌生,这个让我很困惑,所以希望有更多知识的人可以提供帮助。
基本上我有 2 个日期选择器,其中人们 select 他们接下来的 2 个发薪日期,但是如果有人 select 从日期选择器 2 (#incomeNextDate2) 开始的 2 月 1 日或 3 月 1 日那么第一个日期选择器 (#incomeNextDate1) 中的日期显示 01/01/2021 或 02/01/2021。我假设这是日期选择器 2 中的 onselect 函数的问题,但无法确定问题所在。日期选择器的 jquery 如下:
$("#incomeNextDate1").datepicker({
dateFormat: 'dd/mm/yy',
defaultDate: +4,
changeMonth: false,
minDate: 0,
maxDate: +40,
prevText: '<i class="fa fa-chevron-left"></i>',
nextText: '<i class="fa fa-chevron-right"></i>',
onSelect: function( selectedDate ) {
date1 = $('#incomeNextDate1').datepicker('getDate');
var date2 = $('#incomeNextDate1').datepicker('getDate');
date1.setDate(date1.getDate()+4);
date2.setDate(date2.getDate()+45);
$( "#incomeNextDate2" ).datepicker( "option", "maxDate", date2 );
$( "#incomeNextDate2" ).datepicker( "option", "minDate", date1 );
$('#incomeNextDate1').trigger('blur');
}
});
$("#incomeNextDate2").datepicker({
dateFormat: 'dd/mm/yy',
minDate: +4,
maxDate: +80,
changeMonth: false,
prevText: '<i class="fa fa-chevron-left"></i>',
nextText: '<i class="fa fa-chevron-right"></i>',
onSelect: function( selectedDate ) {
var days = Math.floor((new Date(selectedDate) - new Date()) / (1000*60*60*24));
$( "#incomeNextDate1" ).datepicker( "option", "maxDate", Math.min(days, 35) );
$('#incomeNextDate2').trigger('blur');
}
});
我应该补充一点,日期不可能是 01/01/2021 或 02/01/2021,因为它不应该是今天之前的日期,一旦发生这种情况,日期选择器就无法使用,因为我不能再 select 另一个日期或更改月份。
我在这里为你做了一些很酷的东西...
我定义了一些变量来轻松设置 min/max 日期。
这是在使用 moment.js,在涉及日期时我总是推荐它,因为它使日期操作更加容易。
let dp_1 = $("#incomeNextDate1");
let dp_2 = $("#incomeNextDate2");
// Min/max from today for DP_1
let minDaysFromToday = 4;
let maxDaysFromToday = 45;
// Min/max from selected date in DP_1 for DP_2
let minSeconDate = 7;
let maxSecondDate = 21;
let today = moment();
let DP1_min = today.add(minDaysFromToday, "d").format("DD/MM/yyyy");
let DP1_max = today.add(maxDaysFromToday, "d").format("DD/MM/yyyy");
console.log(`${DP1_min} - ${DP1_max}`);
dp_1.datepicker({
dateFormat: "dd/mm/yy",
minDate: DP1_min,
maxDate: DP1_max,
/* Those can only be TEXT because it is used as a title attribute. */
/* It cannot be some fontAwesome icons */
prevText: "PREVIOUS TEXT",
nextText: "NEXT TEXT",
onSelect: function (selectedDate) {
let selected = moment(selectedDate, "DD/MM/yyyy");
let DP2_min = selected.add(minSeconDate, "d").format("DD/MM/yyyy");
let DP2_max = selected.add(maxSecondDate, "d").format("DD/MM/yyyy");
console.log(`${DP2_min} - ${DP2_max}`);
// Set DP_2 min/max
dp_2.datepicker("option", { minDate: DP2_min, maxDate: DP2_max });
// Remove any DP_2 date and focus it
setTimeout(function () {
dp_2.val("").focus();
}, 100);
}
});
dp_2.datepicker({
dateFormat: "dd/mm/yy",
onSelect: function (selectedDate) {
console.log(`Selected dates are ${dp_1.val()} and ${dp_2.val()}`);
}
});
<link href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.css" rel="stylesheet"/>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.2/css/all.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<input type="text" id="incomeNextDate1"/>
<input type="text" id="incomeNextDate2"/>