JavaScript 系列四:第5課
── xdan/datetimepicker 套件
by applelily
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JavaScript 系列四:第5課 ── xdan/datetimepicker 套件</title>
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.5.20/jquery.datetimepicker.css"/>
<link rel="stylesheet" href="./05_js_datetimepicker.css">
</head>
<body>
<div class="container">
<div class="checkin_date">
<p>Days for booking</p>
<input id="date_timepicker_start" type="text" placeholder="From">
<span>⟶</span>
<input id="date_timepicker_end" type="text" placeholder="To">
</div>
<div class="selected_date">
<p class="display_dates" id="display_dates">
<span>Check in: </span>
<span id="from"></span>
<span>Check out: </span>
<span id="to"></span>
<span> Total:</span>
<span id="days"></span>
<!-- <span> Days </span> -->
<span id="nights"></span>
<span> Nights</span>
</p>
</div>
<div class="error_msg">
Please enter the current date.
</div>
</div>
<script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.5.20/jquery.datetimepicker.full.min.js"></script>
<script src="./05_js_datetimepicker.js"></script>
</body>
</html>
CSS
*{
margin:0;
padding: 0;
list-style: none;
font-size: 18px;
}
.container{
margin: 20px;
line-height: 2.5em;
}
.checkin_date{
width: 500px;
border-bottom: 4px solid #9EBF17;
border-right: 60px solid #9EBF17;
border-radius: 5px;
}
.checkin_date p{
font-size: 24px;
color: #aaa;
}
.checkin_date input{
color: #2D2D2D;
line-height: 2;
padding-left: 5px;
border: 1px solid #aaa;
border-radius: 5px;
}
.selected_date{
display: none;
}
.display_dates span{
color: #aaa;
}
#from{
color:#2D2D2D
}
#to{
color:#2D2D2D
}
#days{
display: none;
color:red;
}
#nights{
color:#FF3636;
}
.error_msg{
display: none;
width: 500px;
color:red;
background: rgba(217, 111, 111, 0.756);
border: 1px solid red;
padding: 0 5px;
}
JavaScript
var today = new Date();
var todayFormatted = today.getFullYear() + '/' + (today.getMonth() + 1) + '/' + today.getDate();
var startDate = $('#date_timepicker_start').val();
var endDate = $('#date_timepicker_end').val();
$('#date_timepicker_start').datetimepicker({
format: 'Y/m/d',
minDate: todayFormatted, // Set minimum date to today
onShow: function(ct) {
this.setOptions({
maxDate: $('#date_timepicker_end').val() ? $('#date_timepicker_end').val() : false
});
},
timepicker: false,
onSelectDate: function(ct, $i) {
$('.error_msg').hide();
updateDateDisplay();
}
});
$('#date_timepicker_end').datetimepicker({
format: 'Y/m/d',
minDate: todayFormatted, // Set minimum date to today
onShow: function(ct) {
this.setOptions({
minDate: $('#date_timepicker_start').val() ? $('#date_timepicker_start').val() : todayFormatted
});
},
timepicker: false,
onSelectDate: function(ct, $i) {
$('.error_msg').hide();
updateDateDisplay();
}
});
//秀出天數
function updateDateDisplay() {
var startDate = $('#date_timepicker_start').val();
var endDate = $('#date_timepicker_end').val();
if (startDate && endDate) {
var daysCount = calculateDaysDifference(startDate, endDate);
$('#from').text(startDate);
$('#to').text(endDate);
$('#days').text(daysCount);
$('#nights').text((daysCount-1));
$('.selected_date').show();
}
}
//計算天數
function calculateDaysDifference(start, end) {
if (!start || !end) {
return '';
}
var startDate = new Date(start);
var endDate = new Date(end);
var timeDiff = endDate.getTime() - startDate.getTime();
var daysDiff = Math.ceil(timeDiff / (1000 * 3600 * 24))+1;
return daysDiff;
}
// 将日期字符串转换为 Date 对象并格式化
function parseAndFormatDate(dateStr) {
var parts = dateStr.split('/');
// 检查日期格式是否正确
if (parts.length !== 3) {
...