(function(factory){
if (typeof define === 'function' && define.amd)
define(['jquery'], factory);
else if (typeof exports === 'object')
factory(require('jquery'));
else
factory(jQuery);
}
(function($, undefined){
var DPGlobal = {
modes: [
{
clsName: 'minutes',
navFnc: 'Hours',
navStep: 1
},
{
clsName: 'hours',
navFnc: 'Date',
navStep: 1
},
{
clsName: 'days',
navFnc: 'Month',
navStep: 1
},
{
clsName: 'months',
navFnc: 'FullYear',
navStep: 1
},
{
clsName: 'years',
navFnc: 'FullYear',
navStep: 10
}
],
isLeapYear: function (year) {
return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0))
},
getDaysInMonth: function (year, month) {
return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]
},
getDefaultFormat: function (type, field) {
if (type === 'standard') {
if (field === 'input')
return 'yyyy-mm-dd hh:ii';
else
return 'yyyy-mm-dd hh:ii:ss';
} else if (type === 'php') {
if (field === 'input')
return 'Y-m-d H:i';
else
return 'Y-m-d H:i:s';
} else {
throw new Error('Invalid format type.');
}
},
validParts: function (type) {
if (type === 'standard') {
return /t|hh?|HH?|p|P|z|Z|ii?|ss?|dd?|DD?|mm?|MM?|yy(?:yy)?/g;
} else if (type === 'php') {
return /[dDjlNwzFmMnStyYaABgGhHis]/g;
} else {
throw new Error('Invalid format type.');
}
},
nonpunctuation: /[^ -/:-@[-`{-~tnrTZ]+/g,
parseFormat: function (format, type) {
var separators = format.replace(this.validParts(type), ' ').split(' '),
parts = format.match(this.validParts(type));
if (!separators || !separators.length || !parts || parts.length === 0) {
throw new Error('Invalid date format.');
}
return {separators: separators, parts: parts};
},
parseDate: function (date, format, language, type, timezone) {
if (date instanceof Date) {
var dateUTC = new Date(date.valueOf() - date.getTimezoneOffset() * 60000);
dateUTC.setMilliseconds(0);
return dateUTC;
}
if (/^d{4}-d{1,2}-d{1,2}$/.test(date)) {
format = this.parseFormat('yyyy-mm-dd', type);
}
if (/^d{4}-d{1,2}-d{1,2}[T ]d{1,2}:d{1,2}$/.test(date)) {
format = this.parseFormat('yyyy-mm-dd hh:ii', type);
}
if (/^d{4}-d{1,2}-d{1,2}[T ]d{1,2}:d{1,2}:d{1,2}[Z]{0,1}$/.test(date)) {
format = this.parseFormat('yyyy-mm-dd hh:ii:ss', type);
}
if (/^[-+]d+[dmwy]([s,]+[-+]d+[dmwy])*$/.test(date)) {
var part_re = /([-+]d+)([dmwy])/,
parts = date.match(/([-+]d+)([dmwy])/g),
part, dir;
date = new Date();
for (var i = 0; i < parts.length; i++) {
part = part_re.exec(parts[i]);
dir = parseInt(part[1]);
switch (part[2]) {
case 'd':
date.setUTCDate(date.getUTCDate() + dir);
break;
case 'm':
date = Datetimepicker.prototype.moveMonth.call(Datetimepicker.prototype, date, dir);
break;
case 'w':
date.setUTCDate(date.getUTCDate() + dir * 7);
break;
case 'y':
date = Datetimepicker.prototype.moveYear.call(Datetimepicker.prototype, date, dir);
break;
}
}
return UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), 0);
}
var parts = date && date.toString().match(this.nonpunctuation) || [],
date = new Date(0, 0, 0, 0, 0, 0, 0),
parsed = {},
setters_order = ['hh', 'h', 'ii', 'i', 'ss', 's', 'yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'D', 'DD', 'd', 'dd', 'H', 'HH', 'p', 'P', 'z', 'Z'],
setters_map = {
hh: function (d, v) {
return d.setUTCHours(v);
},
h: function (d, v) {
return d.setUTCHours(v);
},
HH: function (d, v) {
return d.setUTCHours(v === 12 ? 0 : v);
},
H: function (d, v) {
return d.setUTCHours(v === 12 ? 0 : v);
},
ii: function (d, v) {
return d.setUTCMinutes(v);
},
i: function (d, v) {
return d.setUTCMinutes(v);
},
ss: function (d, v) {
return d.setUTCSeconds(v);
},
s: function (d, v) {
return d.setUTCSeconds(v);
},
yyyy: function (d, v) {
return d.setUTCFullYear(v);
},
yy: function (d, v) {
return d.setUTCFullYear(2000 + v);
},
m: function (d, v) {
v -= 1;
while (v < 0) v += 12;
v %= 12;
d.setUTCMonth(v);
while (d.getUTCMonth() !== v)
if (isNaN(d.getUTCMonth()))
return d;
else
d.setUTCDate(d.getUTCDate() - 1);
return d;
},
d: function (d, v) {
return d.setUTCDate(v);
},
p: function (d, v) {
return d.setUTCHours(v === 1 ? d.getUTCHours() + 12 : d.getUTCHours());
},
z: function () {
return timezone
}
},
val, filtered, part;
setters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m'];
setters_map['dd'] = setters_map['d'];
setters_map['P'] = setters_map['p'];
setters_map['Z'] = setters_map['z'];
date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds());
if (parts.length === format.parts.length) {
for (var i = 0, cnt = format.parts.length; i < cnt; i++) {
val = parseInt(parts[i], 10);
part = format.parts[i];
if (isNaN(val)) {
switch (part) {
case 'MM':
filtered = $(dates[language].months).filter(function () {
var m = this.slice(0, parts[i].length),
p = parts[i].slice(0, m.length);
return m === p;
});
val = $.inArray(filtered[0], dates[language].months) + 1;
break;
case 'M':
filtered = $(dates[language].monthsShort).filter(function () {
var m = this.slice(0, parts[i].length),
p = parts[i].slice(0, m.length);
return m.toLowerCase() === p.toLowerCase();
});
val = $.inArray(filtered[0], dates[language].monthsShort) + 1;
break;
case 'p':
case 'P':
val = $.inArray(parts[i].toLowerCase(), dates[language].meridiem);
break;
case 'z':
case 'Z':
timezone;
break;
}
}
parsed[part] = val;
}
for (var i = 0, s; i < setters_order.length; i++) {
s = setters_order[i];
if (s in parsed && !isNaN(parsed[s]))
setters_map[s](date, parsed[s])
}
}
return date;
},
formatDate: function (date, format, language, type, timezone) {
if (date === null) {
return '';
}
var val;
if (type === 'standard') {
val = {
t: date.getTime(),
yy: date.getUTCFullYear().toString().substring(2),
yyyy: date.getUTCFullYear(),
m: date.getUTCMonth() + 1,
M: dates[language].monthsShort[date.getUTCMonth()],
MM: dates[language].months[date.getUTCMonth()],
d: date.getUTCDate(),
D: dates[language].daysShort[date.getUTCDay()],
DD: dates[language].days[date.getUTCDay()],
p: (dates[language].meridiem.length === 2 ? dates[language].meridiem[date.getUTCHours() < 12 ? 0 : 1] : ''),
h: date.getUTCHours(),
i: date.getUTCMinutes(),
s: date.getUTCSeconds(),
z: timezone
};
if (dates[language].meridiem.length === 2) {
val.H = (val.h % 12 === 0 ? 12 : val.h % 12);
}
else {
val.H = val.h;
}
val.HH = (val.H < 10 ? '0' : '') + val.H;
val.P = val.p.toUpperCase();
val.Z = val.z;
val.hh = (val.h < 10 ? '0' : '') + val.h;
val.ii = (val.i < 10 ? '0' : '') + val.i;
val.ss = (val.s < 10 ? '0' : '') + val.s;
val.dd = (val.d < 10 ? '0' : '') + val.d;
val.mm = (val.m < 10 ? '0' : '') + val.m;
} else if (type === 'php') {
val = {
y: date.getUTCFullYear().toString().substring(2),
Y: date.getUTCFullYear(),
F: dates[language].months[date.getUTCMonth()],
M: dates[language].monthsShort[date.getUTCMonth()],
n: date.getUTCMonth() + 1,
t: DPGlobal.getDaysInMonth(date.getUTCFullYear(), date.getUTCMonth()),
j: date.getUTCDate(),
l: dates[language].days[date.getUTCDay()],
D: dates[language].daysShort[date.getUTCDay()],
w: date.getUTCDay(),
N: (date.getUTCDay() === 0 ? 7 : date.getUTCDay()),
S: (date.getUTCDate() % 10 <= dates[language].suffix.length ? dates[language].suffix[date.getUTCDate() % 10 - 1] : ''),
a: (dates[language].meridiem.length === 2 ? dates[language].meridiem[date.getUTCHours() < 12 ? 0 : 1] : ''),
g: (date.getUTCHours() % 12 === 0 ? 12 : date.getUTCHours() % 12),
G: date.getUTCHours(),
i: date.getUTCMinutes(),
s: date.getUTCSeconds()
};
val.m = (val.n < 10 ? '0' : '') + val.n;
val.d = (val.j < 10 ? '0' : '') + val.j;
val.A = val.a.toString().toUpperCase();
val.h = (val.g < 10 ? '0' : '') + val.g;
val.H = (val.G < 10 ? '0' : '') + val.G;
val.i = (val.i < 10 ? '0' : '') + val.i;
val.s = (val.s < 10 ? '0' : '') + val.s;
} else {
throw new Error('Invalid format type.');
}
var date = [],
seps = $.extend([], format.separators);
for (var i = 0, cnt = format.parts.length; i < cnt; i++) {
if (seps.length) {
date.push(seps.shift());
}
date.push(val[format.parts[i]]);
}
if (seps.length) {
date.push(seps.shift());
}
return date.join('');
},
convertViewMode: function (viewMode) {
switch (viewMode) {
case 4:
case 'decade':
viewMode = 4;
break;
case 3:
case 'year':
viewMode = 3;
break;
case 2:
case 'month':
viewMode = 2;
break;
case 1:
case 'day':
viewMode = 1;
break;
case 0:
case 'hour':
viewMode = 0;
break;
}
return viewMode;
},
headTemplate: '<thead>' +
'<tr>' +
'<th class="prev"><i class="{iconType} {leftArrow}"/></th>' +
'<th colspan="5" class="switch"></th>' +
'<th class="next"><i class="{iconType} {rightArrow}"/></th>' +
'</tr>' +
'</thead>',
headTemplateV3: '<thead>' +
'<tr>' +
'<th class="prev"><span class="{iconType} {leftArrow}"></span> </th>' +
'<th colspan="5" class="switch"></th>' +
'<th class="next"><span class="{iconType} {rightArrow}"></span> </th>' +
'</tr>' +
'</thead>',
contTemplate: '<tbody><tr><td colspan="7"></td></tr></tbody>',
footTemplate: '<tfoot>' +
'<tr><th colspan="7" class="today"></th></tr>' +
'<tr><th colspan="7" class="clear"></th></tr>' +
'</tfoot>'
};
DPGlobal.template = '<div class="datetimepicker">' +
'<div class="datetimepicker-minutes">' +
'<table class=" table-condensed">' +
DPGlobal.headTemplate +
DPGlobal.contTemplate +
DPGlobal.footTemplate +
'</table>' +
'</div>' +
'<div class="datetimepicker-hours">' +
'<table class=" table-condensed">' +
DPGlobal.headTemplate +
DPGlobal.contTemplate +
DPGlobal.footTemplate +
'</table>' +
'</div>' +
'<div class="datetimepicker-days">' +
'<table class=" table-condensed">' +
DPGlobal.headTemplate +
'<tbody></tbody>' +
DPGlobal.footTemplate +
'</table>' +
'</div>' +
'<div class="datetimepicker-months">' +
'<table class="table-condensed">' +
DPGlobal.headTemplate +
DPGlobal.contTemplate +
DPGlobal.footTemplate +
'</table>' +
'</div>' +
'<div class="datetimepicker-years">' +
'<table class="table-condensed">' +
DPGlobal.headTemplate +
DPGlobal.contTemplate +
DPGlobal.footTemplate +
'</table>' +
'</div>' +
'</div>';
DPGlobal.templateV3 = '<div class="datetimepicker">' +
'<div class="datetimepicker-minutes">' +
'<table class=" table-condensed">' +
DPGlobal.headTemplateV3 +
DPGlobal.contTemplate +
DPGlobal.footTemplate +
'</table>' +
'</div>' +
'<div class="datetimepicker-hours">' +
'<table class=" table-condensed">' +
DPGlobal.headTemplateV3 +
DPGlobal.contTemplate +
DPGlobal.footTemplate +
'</table>' +
'</div>' +
'<div class="datetimepicker-days">' +
'<table class=" table-condensed">' +
DPGlobal.headTemplateV3 +
'<tbody></tbody>' +
DPGlobal.footTemplate +
'</table>' +
'</div>' +
'<div class="datetimepicker-months">' +
'<table class="table-condensed">' +
DPGlobal.headTemplateV3 +
DPGlobal.contTemplate +
DPGlobal.footTemplate +
'</table>' +
'</div>' +
'<div class="datetimepicker-years">' +
'<table class="table-condensed">' +
DPGlobal.headTemplateV3 +
DPGlobal.contTemplate +
DPGlobal.footTemplate +
'</table>' +
'</div>' +
'</div>';
$.fn.datetimepicker.DPGlobal = DPGlobal;
$.fn.datetimepicker.noConflict = function () {
$.fn.datetimepicker = old;
return this;
};
$(document).on(
'focus.datetimepicker.data-api click.datetimepicker.data-api',
'[data-provide="datetimepicker"]',
function (e) {
var $this = $(this);
if ($this.data('datetimepicker')) return;
e.preventDefault();
$this.datetimepicker('show');
}
);
$(function () {
$('[data-provide="datetimepicker-inline"]').datetimepicker();
});
}));
$('.form_datetime').datetimepicker({
language: 'fr',
weekStart: 1,
todayBtn: 0,
autoclose: 1,
todayHighlight: 1,
startView: 2,
forceParse: 0,
showMeridian: 1,
});
.datetimepicker table tr td.active:active,
.datetimepicker table tr td.active:hover:active,
.datetimepicker table tr td.active.disabled:active,
.datetimepicker table tr td.active.disabled:hover:active,
.datetimepicker table tr td.active.active,
.datetimepicker table tr td.active:hover.active,
.datetimepicker table tr td.active.disabled.active,
.datetimepicker table tr td.active.disabled:hover.active {
background-color: #039;
}
.datetimepicker table tr td span {
display: block;
width: 23%;
height: 54px;
line-height: 54px;
float: left;
margin: 1%;
cursor: pointer;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}
.datetimepicker .datetimepicker-hours span {
height: 26px;
line-height: 26px;
}
.datetimepicker .datetimepicker-hours table tr td span.hour_am,
.datetimepicker .datetimepicker-hours table tr td span.hour_pm {
width: 14.6%;
}
.datetimepicker .datetimepicker-hours fieldset legend,
.datetimepicker .datetimepicker-minutes fieldset legend {
margin-bottom: inherit;
line-height: 30px;
}
.datetimepicker .datetimepicker-minutes span {
height: 26px;
line-height: 26px;
}
.datetimepicker table tr td span:hover {
background: #eee;
}
.datetimepicker table tr td span.disabled,
.datetimepicker table tr td span.disabled:hover {
background: 0;
color: #999;
cursor: default;
}
.datetimepicker table tr td span.active,
.datetimepicker table tr td span.active:hover,
.datetimepicker table tr td span.active.disabled,
.datetimepicker table tr td span.active.disabled:hover {
background-color: #006dcc;
background-image: -moz-linear-gradient(top, #08c, #04c);
background-image: -ms-linear-gradient(top, #08c, #04c);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#04c));
background-image: -webkit-linear-gradient(top, #08c, #04c);
background-image: -o-linear-gradient(top, #08c, #04c);
background-image: linear-gradient(to bottom, #08c, #04c);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);
border-color: #04c #04c #002a80;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
color: #fff;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/4.17.37/js/bootstrap-datetimepicker.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet"/>
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/4.17.37/css/bootstrap-datetimepicker.css" rel="stylesheet"/>
<input class="form-control form_datetime" data-date-format="dd-MM-yyyy hh:mm" data-link-field="dtp_input1" type="text" required autocomplete="off" data-link-format="dd-mmm-yyyy hh:mm" >