先添加一个时间控件
moment.js
// moment.js
// version : 2.1.0
// author : Tim Wood
// license : MIT
// momentjs.com
!
function (t) {
function e(t, e) {
return function (n) {
return u(t.call(this, n), e)
}
}
function n(t, e) {
return function (n) {
return this.lang().ordinal(t.call(this, n), e)
}
}
function s() { }
function i(t) {
a(this, t)
}
function r(t) {
var e = t.years || t.year || t.y || 0,
n = t.months || t.month || t.M || 0,
s = t.weeks || t.week || t.w || 0,
i = t.days || t.day || t.d || 0,
r = t.hours || t.hour || t.h || 0,
a = t.minutes || t.minute || t.m || 0,
o = t.seconds || t.second || t.s || 0,
u = t.milliseconds || t.millisecond || t.ms || 0;
this._input = t,
this._milliseconds = u + 1e3 * o + 6e4 * a + 36e5 * r,
this._days = i + 7 * s,
this._months = n + 12 * e,
this._data = {},
this._bubble()
}
function a(t, e) {
for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]);
return t
}
function o(t) {
return 0 > t ? Math.ceil(t) : Math.floor(t)
}
function u(t, e) {
for (var n = t + ""; n.length < e; ) n = "0" + n;
return n
}
function h(t, e, n, s) {
var i, r, a = e._milliseconds,
o = e._days,
u = e._months;
a && t._d.setTime(+t._d + a * n),
(o || u) && (i = t.minute(), r = t.hour()),
o && t.date(t.date() + o * n),
u && t.month(t.month() + u * n),
a && !s && H.updateOffset(t),
(o || u) && (t.minute(i), t.hour(r))
}
function d(t) {
return "[object Array]" === Object.prototype.toString.call(t)
}
function c(t, e) {
var n, s = Math.min(t.length, e.length),
i = Math.abs(t.length - e.length),
r = 0;
for (n = 0; s > n; n++) ~ ~t[n] !== ~ ~e[n] && r++;
return r + i
}
function f(t) {
return t ? ie[t] || t.toLowerCase().replace(/(.)s$/, "$1") : t
}
function l(t, e) {
return e.abbr = t,
x[t] || (x[t] = new s),
x[t].set(e),
x[t]
}
function _(t) {
if (!t) return H.fn._lang;
if (!x[t] && A) try {
require("./lang/" + t)
} catch (e) {
return H.fn._lang
}
return x[t]
}
function m(t) {
return t.match(/\[.*\]/) ? t.replace(/^\[|\]$/g, "") : t.replace(/\\/g, "")
}
function y(t) {
var e, n, s = t.match(E);
for (e = 0, n = s.length; n > e; e++) s[e] = ue[s[e]] ? ue[s[e]] : m(s[e]);
return function (i) {
var r = "";
for (e = 0; n > e; e++) r += s[e] instanceof Function ? s[e].call(i, t) : s[e];
return r
}
}
function M(t, e) {
function n(e) {
return t.lang().longDateFormat(e) || e
}
for (var s = 5; s-- && N.test(e); ) e = e.replace(N, n);
return re[e] || (re[e] = y(e)),
re[e](t)
}
function g(t, e) {
switch (t) {
case "DDDD":
return V;
case "YYYY":
return X;
case "YYYYY":
return $;
case "S":
case "SS":
case "SSS":
case "DDD":
return I;
case "MMM":
case "MMMM":
case "dd":
case "ddd":
case "dddd":
return R;
case "a":
case "A":
return _(e._l)._meridiemParse;
case "X":
return B;
case "Z":
case "ZZ":
return j;
case "T":
return q;
case "MM":
case "DD":
case "YY":
case "HH":
case "hh":
case "mm":
case "ss":
case "M":
case "D":
case "d":
case "H":
case "h":
case "m":
case "s":
return J;
default:
return new RegExp(t.replace("\\", ""))
}
}
function p(t) {
var e = (j.exec(t) || [])[0],
n = (e + "").match(ee) || ["-", 0, 0],
s = +(60 * n[1]) + ~ ~n[2];
return "+" === n[0] ? -s : s
}
function D(t, e, n) {
var s, i = n._a;
switch (t) {
case "M":
case "MM":
i[1] = null == e ? 0 : ~ ~e - 1;
break;
case "MMM":
case "MMMM":
s = _(n._l).monthsParse(e),
null != s ? i[1] = s : n._isValid = !1;
break;
case "D":
case "DD":
case "DDD":
case "DDDD":
null != e && (i[2] = ~ ~e);
break;
case "YY":
i[0] = ~ ~e + (~ ~e > 68 ? 1900 : 2e3);
break;
case "YYYY":
case "YYYYY":
i[0] = ~ ~e;
break;
case "a":
case "A":
n._isPm = _(n._l).isPM(e);
break;
case "H":
case "HH":
case "h":
case "hh":
i[3] = ~ ~e;
break;
case "m":
case "mm":
i[4] = ~ ~e;
break;
case "s":
case "ss":
i[5] = ~ ~e;
break;
case "S":
case "SS":
case "SSS":
i[6] = ~ ~(1e3 * ("0." + e));
break;
case "X":
n._d = new Date(1e3 * parseFloat(e));
break;
case "Z":
case "ZZ":
n._useUTC = !0,
n._tzm = p(e)
}
null == e && (n._isValid = !1)
}
function Y(t) {
var e, n, s = [];
if (!t._d) {
for (e = 0; 7 > e; e++) t._a[e] = s[e] = null == t._a[e] ? 2 === e ? 1 : 0 : t._a[e];
s[3] += ~ ~((t._tzm || 0) / 60),
s[4] += ~ ~((t._tzm || 0) % 60),
n = new Date(0),
t._useUTC ? (n.setUTCFullYear(s[0], s[1], s[2]), n.setUTCHours(s[3], s[4], s[5], s[6])) : (n.setFullYear(s[0], s[1], s[2]), n.setHours(s[3], s[4], s[5], s[6])),
t._d = n
}
}
function w(t) {
var e, n, s = t._f.match(E),
i = t._i;
for (t._a = [], e = 0; e < s.length; e++) n = (g(s[e], t).exec(i) || [])[0],
n && (i = i.slice(i.indexOf(n) + n.length)),
ue[s[e]] && D(s[e], n, t);
i && (t._il = i),
t._isPm && t._a[3] < 12 && (t._a[3] += 12),
t._isPm === !1 && 12 === t._a[3] && (t._a[3] = 0),
Y(t)
}
function k(t) {
var e, n, s, r, o, u = 99;
for (r = 0; r < t._f.length; r++) e = a({},
t),
e._f = t._f[r],
w(e),
n = new i(e),
o = c(e._a, n.toArray()),
n._il && (o += n._il.length),
u > o && (u = o, s = n);
a(t, s)
}
function v(t) {
var e, n = t._i,
s = K.exec(n);
if (s) {
for (t._f = "YYYY-MM-DD" + (s[2] || " "), e = 0; 4 > e; e++) if (te[e][1].exec(n)) {
t._f += te[e][0];
break
}
j.exec(n) && (t._f += " Z"),
w(t)
} else t._d = new Date(n)
}
function T(e) {
var n = e._i,
s = G.exec(n);
n === t ? e._d = new Date : s ? e._d = new Date(+s[1]) : "string" == typeof n ? v(e) : d(n) ? (e._a = n.slice(0), Y(e)) : e._d = n instanceof Date ? new Date(+n) : new Date(n)
}
function b(t, e, n, s, i) {
return i.relativeTime(e || 1, !!n, t, s)
}
function S(t, e, n) {
var s = W(Math.abs(t) / 1e3),
i = W(s / 60),
r = W(i / 60),
a = W(r / 24),
o = W(a / 365),
u = 45 > s && ["s", s] || 1 === i && ["m"] || 45 > i && ["mm", i] || 1 === r && ["h"] || 22 > r && ["hh", r] || 1 === a && ["d"] || 25 >= a && ["dd", a] || 45 >= a && ["M"] || 345 > a && ["MM", W(a / 30)] || 1 === o && ["y"] || ["yy", o];
return u[2] = e,
u[3] = t > 0,
u[4] = n,
b.apply({},
u)
}
function F(t, e, n) {
var s, i = n - e,
r = n - t.day();
return r > i && (r -= 7),
i - 7 > r && (r += 7),
s = H(t).add("d", r),
{
week: Math.ceil(s.dayOfYear() / 7),
year: s.year()
}
}
function O(t) {
var e = t._i,
n = t._f;
return null === e || "" === e ? null : ("string" == typeof e && (t._i = e = _().preparse(e)), H.isMoment(e) ? (t = a({},
e), t._d = new Date(+e._d)) : n ? d(n) ? k(t) : w(t) : T(t), new i(t))
}
function z(t, e) {
H.fn[t] = H.fn[t + "s"] = function (t) {
var n = this._isUTC ? "UTC" : "";
return null != t ? (this._d["set" + n + e](t), H.updateOffset(this), this) : this._d["get" + n + e]()
}
}
function C(t) {
H.duration.fn[t] = function () {
return this._data[t]
}
}
function L(t, e) {
H.duration.fn["as" + t] = function () {
return +this / e
}
}
for (var H, P, U = "2.1.0", W = Math.round, x = {}, A = "undefined" != typeof module && module.exports, G = /^\/?Date\((\-?\d+)/i, Z = /(\-)?(\d*)?\.?(\d+)\:(\d+)\:(\d+)\.?(\d{3})?/, E = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|SS?S?|X|zz?|ZZ?|.)/g, N = /(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g, J = /\d\d?/, I = /\d{1,3}/, V = /\d{3}/, X = /\d{1,4}/, $ = /[+\-]?\d{1,6}/, R = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, j = /Z|[\+\-]\d\d:?\d\d/i, q = /T/i, B = /[\+\-]?\d+(\.\d{1,3})?/, K = /^\s*\d{4}-\d\d-\d\d((T| )(\d\d(:\d\d(:\d\d(\.\d\d?\d?)?)?)?)?([\+\-]\d\d:?\d\d)?)?/, Q = "YYYY-MM-DDTHH:mm:ssZ", te = [["HH:mm:ss.S", /(T| )\d\d:\d\d:\d\d\.\d{1,3}/], ["HH:mm:ss", /(T| )\d\d:\d\d:\d\d/], ["HH:mm", /(T| )\d\d:\d\d/], ["HH", /(T| )\d\d/]], ee = /([\+\-]|\d\d)/gi, ne = "Date|Hours|Minutes|Seconds|Milliseconds".split("|"), se = {
Milliseconds: 1,
Seconds: 1e3,
Minutes: 6e4,
Hours: 36e5,
Days: 864e5,
Months: 2592e6,
Years: 31536e6
},
ie = {
ms: "millisecond",
s: "second",
m: "minute",
h: "hour",
d: "day",
w: "week",
M: "month",
y: "year"
},
re = {},
ae = "DDD w W M D d".split(" "), oe = "M D H h m s w W".split(" "), ue = {
M: function () {
return this.month() + 1
},
MMM: function (t) {
return this.lang().monthsShort(this, t)
},
MMMM: function (t) {
return this.lang().months(this, t)
},
D: function () {
return this.date()
},
DDD: function () {
return this.dayOfYear()
},
d: function () {
return this.day()
},
dd: function (t) {
return this.lang().weekdaysMin(this, t)
},
ddd: function (t) {
return this.lang().weekdaysShort(this, t)
},
dddd: function (t) {
return this.lang().weekdays(this, t)
},
w: function () {
return this.week()
},
W: function () {
return this.isoWeek()
},
YY: function () {
return u(this.year() % 100, 2)
},
YYYY: function () {
return u(this.year(), 4)
},
YYYYY: function () {
return u(this.year(), 5)
},
gg: function () {
return u(this.weekYear() % 100, 2)
},
gggg: function () {
return this.weekYear()
},
ggggg: function () {
return u(this.weekYear(), 5)
},
GG: function () {
return u(this.isoWeekYear() % 100, 2)
},
GGGG: function () {
return this.isoWeekYear()
},
GGGGG: function () {
return u(this.isoWeekYear(), 5)
},
e: function () {
return this.weekday()
},
E: function () {
return this.isoWeekday()
},
a: function () {
return this.lang().meridiem(this.hours(), this.minutes(), !0)
},
A: function () {
return this.lang().meridiem(this.hours(), this.minutes(), !1)
},
H: function () {
return this.hours()
},
h: function () {
return this.hours() % 12 || 12
},
m: function () {
return this.minutes()
},
s: function () {
return this.seconds()
},
S: function () {
return ~ ~(this.milliseconds() / 100)
},
SS: function () {
return u(~ ~(this.milliseconds() / 10), 2)
},
SSS: function () {
return u(this.milliseconds(), 3)
},
Z: function () {
var t = -this.zone(),
e = "+";
return 0 > t && (t = -t, e = "-"),
e + u(~ ~(t / 60), 2) + ":" + u(~ ~t % 60, 2)
},
ZZ: function () {
var t = -this.zone(),
e = "+";
return 0 > t && (t = -t, e = "-"),
e + u(~ ~(10 * t / 6), 4)
},
z: function () {
return this.zoneAbbr()
},
zz: function () {
return this.zoneName()
},
X: function () {
return this.unix()
}
}; ae.length; ) P = ae.pop(),
ue[P + "o"] = n(ue[P], P);
for (; oe.length; ) P = oe.pop(),
ue[P + P] = e(ue[P], 2);
for (ue.DDDD = e(ue.DDD, 3), s.prototype = {
set: function (t) {
var e, n;
for (n in t) e = t[n],
"function" == typeof e ? this[n] = e : this["_" + n] = e
},
_months: "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
months: function (t) {
return this._months[t.month()]
},
_monthsShort: "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
monthsShort: function (t) {
return this._monthsShort[t.month()]
},
_monthsChShort: "一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),
monthsChShort: function (t) {
return this._monthsChShort[t.month()]
},
monthsParse: function (t) {
var e, n, s;
for (this._monthsParse || (this._monthsParse = []), e = 0; 12 > e; e++) if (this._monthsParse[e] || (n = H([2e3, e]), s = "^" + this.months(n, "") + "|^" + this.monthsShort(n, ""), this._monthsParse[e] = new RegExp(s.replace(".", ""), "i")), this._monthsParse[e].test(t)) return e
},
_weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
weekdays: function (t) {
return this._weekdays[t.day()]
},
_weekdaysShort: "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
weekdaysShort: function (t) {
return this._weekdaysShort[t.day()]
},
_weekdaysMin: "Su_Mo_Tu_We_Th_Fr_Sa".split("_"),
weekdaysMin: function (t) {
return this._weekdaysMin[t.day()]
},
_weekChdaysMin: "日_一_二_三_四_五_六".split("_"),
weekChdaysMin: function (t) {
return this._weekChdaysMin[t.day()]
},
weekdaysParse: function (t) {
var e, n, s;
for (this._weekdaysParse || (this._weekdaysParse = []), e = 0; 7 > e; e++) if (this._weekdaysParse[e] || (n = H([2e3, 1]).day(e), s = "^" + this.weekdays(n, "") + "|^" + this.weekdaysShort(n, "") + "|^" + this.weekdaysMin(n, ""), this._weekdaysParse[e] = new RegExp(s.replace(".", ""), "i")), this._weekdaysParse[e].test(t)) return e
},
_longDateFormat: {
LT: "h:mm A",
L: "MM/DD/YYYY",
LC: "YYYY-MM-DD",
LL: "MMMM D YYYY",
LLL: "MMMM D YYYY LT",
LLLL: "dddd, MMMM D YYYY LT"
},
longDateFormat: function (t) {
var e = this._longDateFormat[t];
return !e && this._longDateFormat[t.toUpperCase()] && (e = this._longDateFormat[t.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,
function (t) {
return t.slice(1)
}), this._longDateFormat[t] = e),
e
},
isPM: function (t) {
return "p" === (t + "").toLowerCase()[0]
},
_meridiemParse: /[ap]\.?m?\.?/i,
meridiem: function (t, e, n) {
return t > 11 ? n ? "pm" : "PM" : n ? "am" : "AM"
},
_calendar: {
sameDay: "[Today at] LT",
nextDay: "[Tomorrow at] LT",
nextWeek: "dddd [at] LT",
lastDay: "[Yesterday at] LT",
lastWeek: "[Last] dddd [at] LT",
sameElse: "L"
},
calendar: function (t, e) {
var n = this._calendar[t];
return "function" == typeof n ? n.apply(e) : n
},
_relativeTime: {
future: "in %s",
past: "%s ago",
s: "a few seconds",
m: "a minute",
mm: "%d minutes",
h: "an hour",
hh: "%d hours",
d: "a day",
dd: "%d days",
M: "a month",
MM: "%d months",
y: "a year",
yy: "%d years"
},
relativeTime: function (t, e, n, s) {
var i = this._relativeTime[n];
return "function" == typeof i ? i(t, e, n, s) : i.replace(/%d/i, t)
},
pastFuture: function (t, e) {
var n = this._relativeTime[t > 0 ? "future" : "past"];
return "function" == typeof n ? n(e) : n.replace(/%s/i, e)
},
ordinal: function (t) {
return this._ordinal.replace("%d", t)
},
_ordinal: "%d",
preparse: function (t) {
return t
},
postformat: function (t) {
return t
},
week: function (t) {
return F(t, this._week.dow, this._week.doy).week
},
_week: {
dow: 0,
doy: 6
}
},
H = function (t, e, n) {
return O({
_i: t,
_f: e,
_l: n,
_isUTC: !1
})
},
H.utc = function (t, e, n) {
return O({
_useUTC: !0,
_isUTC: !0,
_l: n,
_i: t,
_f: e
})
},
H.unix = function (t) {
return H(1e3 * t)
},
H.duration = function (t, e) {
var n, s, i = H.isDuration(t),
a = "number" == typeof t,
o = i ? t._input : a ? {} : t,
u = Z.exec(t);
return a ? e ? o[e] = t : o.milliseconds = t : u && (n = "-" === u[1] ? -1 : 1, o = {
y: 0,
d: ~ ~u[2] * n,
h: ~ ~u[3] * n,
m: ~ ~u[4] * n,
s: ~ ~u[5] * n,
ms: ~ ~u[6] * n
}),
s = new r(o),
i && t.hasOwnProperty("_lang") && (s._lang = t._lang),
s
},
H.version = U, H.defaultFormat = Q, H.updateOffset = function () { },
H.lang = function (t, e) {
return t ? (e ? l(t, e) : x[t] || _(t), H.duration.fn._lang = H.fn._lang = _(t), void 0) : H.fn._lang._abbr
},
H.langData = function (t) {
return t && t._lang && t._lang._abbr && (t = t._lang._abbr),
_(t)
},
H.isMoment = function (t) {
return t instanceof i
},
H.isDuration = function (t) {
return t instanceof r
},
H.fn = i.prototype = {
clone: function () {
return H(this)
},
valueOf: function () {
return +this._d + 6e4 * (this._offset || 0)
},
unix: function () {
return Math.floor(+this / 1e3)
},
toString: function () {
return this.format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")
},
toDate: function () {
return this._offset ? new Date(+this) : this._d
},
toISOString: function () {
return M(H(this).utc(), "YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")
},
toArray: function () {
var t = this;
return [t.year(), t.month(), t.date(), t.hours(), t.minutes(), t.seconds(), t.milliseconds()]
},
isValid: function () {
return null == this._isValid && (this._isValid = this._a ? !c(this._a, (this._isUTC ? H.utc(this._a) : H(this._a)).toArray()) : !isNaN(this._d.getTime())),
!!this._isValid
},
utc: function () {
return this.zone(0)
},
local: function () {
return this.zone(0),
this._isUTC = !1,
this
},
format: function (t) {
var e = M(this, t || H.defaultFormat);
return this.lang().postformat(e)
},
add: function (t, e) {
var n;
return n = "string" == typeof t ? H.duration(+e, t) : H.duration(t, e),
h(this, n, 1),
this
},
subtract: function (t, e) {
var n;
return n = "string" == typeof t ? H.duration(+e, t) : H.duration(t, e),
h(this, n, -1),
this
},
diff: function (t, e, n) {
var s, i, r = this._isUTC ? H(t).zone(this._offset || 0) : H(t).local(),
a = 6e4 * (this.zone() - r.zone());
return e = f(e),
"year" === e || "month" === e ? (s = 432e5 * (this.daysInMonth() + r.daysInMonth()), i = 12 * (this.year() - r.year()) + (this.month() - r.month()), i += (this - H(this).startOf("month") - (r - H(r).startOf("month"))) / s, i -= 6e4 * (this.zone() - H(this).startOf("month").zone() - (r.zone() - H(r).startOf("month").zone())) / s, "year" === e && (i /= 12)) : (s = this - r, i = "second" === e ? s / 1e3 : "minute" === e ? s / 6e4 : "hour" === e ? s / 36e5 : "day" === e ? (s - a) / 864e5 : "week" === e ? (s - a) / 6048e5 : s),
n ? i : o(i)
},
from: function (t, e) {
return H.duration(this.diff(t)).lang(this.lang()._abbr).humanize(!e)
},
fromNow: function (t) {
return this.from(H(), t)
},
calendar: function () {
var t = this.diff(H().startOf("day"), "days", !0),
e = -6 > t ? "sameElse" : -1 > t ? "lastWeek" : 0 > t ? "lastDay" : 1 > t ? "sameDay" : 2 > t ? "nextDay" : 7 > t ? "nextWeek" : "sameElse";
return this.format(this.lang().calendar(e, this))
},
isLeapYear: function () {
var t = this.year();
return 0 === t % 4 && 0 !== t % 100 || 0 === t % 400
},
isDST: function () {
return this.zone() < this.clone().month(0).zone() || this.zone() < this.clone().month(5).zone()
},
day: function (t) {
var e = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
return null != t ? "string" == typeof t && (t = this.lang().weekdaysParse(t), "number" != typeof t) ? this : this.add({
d: t - e
}) : e
},
month: function (t) {
var e, n = this._isUTC ? "UTC" : "";
return null != t ? "string" == typeof t && (t = this.lang().monthsParse(t), "number" != typeof t) ? this : (e = this.date(), this.date(1), this._d["set" + n + "Month"](t), this.date(Math.min(e, this.daysInMonth())), H.updateOffset(this), this) : this._d["get" + n + "Month"]()
},
startOf: function (t) {
switch (t = f(t)) {
case "year":
this.month(0);
case "month":
this.date(1);
case "week":
case "day":
this.hours(0);
case "hour":
this.minutes(0);
case "minute":
this.seconds(0);
case "second":
this.milliseconds(0)
}
return "week" === t && this.weekday(0),
this
},
endOf: function (t) {
return this.startOf(t).add(t, 1).subtract("ms", 1)
},
isAfter: function (t, e) {
return e = "undefined" != typeof e ? e : "millisecond",
+this.clone().startOf(e) > +H(t).startOf(e)
},
isBefore: function (t, e) {
return e = "undefined" != typeof e ? e : "millisecond",
+this.clone().startOf(e) < +H(t).startOf(e)
},
isSame: function (t, e) {
return e = "undefined" != typeof e ? e : "millisecond",
+this.clone().startOf(e) === +H(t).startOf(e)
},
min: function (t) {
return t = H.apply(null, arguments),
this > t ? this : t
},
max: function (t) {
return t = H.apply(null, arguments),
t > this ? this : t
},
zone: function (t) {
var e = this._offset || 0;
return null == t ? this._isUTC ? e : this._d.getTimezoneOffset() : ("string" == typeof t && (t = p(t)), Math.abs(t) < 16 && (t = 60 * t), this._offset = t, this._isUTC = !0, e !== t && h(this, H.duration(e - t, "m"), 1, !0), this)
},
zoneAbbr: function () {
return this._isUTC ? "UTC" : ""
},
zoneName: function () {
return this._isUTC ? "Coordinated Universal Time" : ""
},
daysInMonth: function () {
return H.utc([this.year(), this.month() + 1, 0]).date()
},
dayOfYear: function (t) {
var e = W((H(this).startOf("day") - H(this).startOf("year")) / 864e5) + 1;
return null == t ? e : this.add("d", t - e)
},
weekYear: function (t) {
var e = F(this, this.lang()._week.dow, this.lang()._week.doy).year;
return null == t ? e : this.add("y", t - e)
},
isoWeekYear: function (t) {
var e = F(this, 1, 4).year;
return null == t ? e : this.add("y", t - e)
},
week: function (t) {
var e = this.lang().week(this);
return null == t ? e : this.add("d", 7 * (t - e))
},
isoWeek: function (t) {
var e = F(this, 1, 4).week;
return null == t ? e : this.add("d", 7 * (t - e))
},
weekday: function (t) {
var e = (this._d.getDay() + 7 - this.lang()._week.dow) % 7;
return null == t ? e : this.add("d", t - e)
},
isoWeekday: function (t) {
return null == t ? this.day() || 7 : this.day(this.day() % 7 ? t : t - 7)
},
lang: function (e) {
return e === t ? this._lang : (this._lang = _(e), this)
}
},
P = 0; P < ne.length; P++) z(ne[P].toLowerCase().replace(/s$/, ""), ne[P]);
z("year", "FullYear"),
H.fn.days = H.fn.day,
H.fn.months = H.fn.month,
H.fn.weeks = H.fn.week,
H.fn.isoWeeks = H.fn.isoWeek,
H.fn.toJSON = H.fn.toISOString,
H.duration.fn = r.prototype = {
_bubble: function () {
var t, e, n, s, i = this._milliseconds,
r = this._days,
a = this._months,
u = this._data;
u.milliseconds = i % 1e3,
t = o(i / 1e3),
u.seconds = t % 60,
e = o(t / 60),
u.minutes = e % 60,
n = o(e / 60),
u.hours = n % 24,
r += o(n / 24),
u.days = r % 30,
a += o(r / 30),
u.months = a % 12,
s = o(a / 12),
u.years = s
},
weeks: function () {
return o(this.days() / 7)
},
valueOf: function () {
return this._milliseconds + 864e5 * this._days + 2592e6 * (this._months % 12) + 31536e6 * ~ ~(this._months / 12)
},
humanize: function (t) {
var e = +this,
n = S(e, !t, this.lang());
return t && (n = this.lang().pastFuture(e, n)),
this.lang().postformat(n)
},
add: function (t, e) {
var n = H.duration(t, e);
return this._milliseconds += n._milliseconds,
this._days += n._days,
this._months += n._months,
this._bubble(),
this
},
subtract: function (t, e) {
var n = H.duration(t, e);
return this._milliseconds -= n._milliseconds,
this._days -= n._days,
this._months -= n._months,
this._bubble(),
this
},
get: function (t) {
return t = f(t),
this[t.toLowerCase() + "s"]()
},
as: function (t) {
return t = f(t),
this["as" + t.charAt(0).toUpperCase() + t.slice(1) + "s"]()
},
lang: H.fn.lang
};
for (P in se) se.hasOwnProperty(P) && (L(P, se[P]), C(P.toLowerCase()));
L("Weeks", 6048e5),
H.duration.fn.asMonths = function () {
return (+this - 31536e6 * this.years()) / 2592e6 + 12 * this.years()
},
H.lang("en", {
ordinal: function (t) {
var e = t % 10,
n = 1 === ~ ~(t % 100 / 10) ? "th" : 1 === e ? "st" : 2 === e ? "nd" : 3 === e ? "rd" : "th";
return t + n
}
}),
A && (module.exports = H),
"undefined" == typeof ender && (this.moment = H),
"function" == typeof define && define.amd && define("moment", [],
function () {
return H
})
} .call(this);
在添加一个用来实现的js
/// <reference path="jquery-1.5.1.min.js" />
/**
* @version: 1.2
* @author: Dan Grossman http://www.dangrossman.info/
* @date: 2013-07-25
* @copyright: Copyright (c) 2012-2013 Dan Grossman. All rights reserved.
* @license: Licensed under Apache License v2.0. See http://www.apache.org/licenses/LICENSE-2.0
* @website: http://www.improvely.com/
*/
!
function (e) {
var t = function (t, n, r) {
var i = typeof n == "object",
s;
this.startDate = moment().startOf("day");
this.endDate = moment().startOf("day");
this.minDate = !1;
this.maxDate = !1;
this.dateLimit = !1;
this.showDropdowns = !1;
this.showWeekNumbers = !1;
this.timePicker = !1;
this.timePickerIncrement = 30;
this.timePicker12Hour = !0;
this.ranges = {};
this.opens = "right";
this.buttonClasses = [];
this.applyClass = "sel";
this.cancelClass = "sel";
// this.format = "MM/DD/YYYY";
//this.format = "YYYY-MM-DD";
this.separator = " - ";
this.locale = {
applyLabel: "确定",
cancelLabel: "取消",
fromLabel: "从",
toLabel: "至",
weekLabel: "W",
customRangeLabel: "自定义时间范围",
daysOfWeek: moment()._lang._weekChdaysMin.slice(),
monthNames: moment()._lang._monthsChShort.slice(),
firstDay: 0
};
this.cb = function () { };
this.element = e(t);
this.element.hasClass("pull-right") && (this.opens = "left");
this.element.is("input") ? this.element.on({
click: e.proxy(this.show, this),
focus: e.proxy(this.show, this)
}) : this.element.on("click", e.proxy(this.show, this));
s = this.locale;
if (i) {
typeof n.locale == "object" && e.each(s,
function (e, t) {
s[e] = n.locale[e] || t
});
n.applyClass && (this.applyClass = n.applyClass);
n.cancelClass && (this.cancelClass = n.cancelClass)
}
var o = '<div class="daterangepicker dropdown-menu"><div class="calendar left"></div><div class="calendar right"></div><div class="ranges"><div class="range_inputs"><div class="daterangepicker_start_input" ><label for="daterangepicker_start">' + this.locale.fromLabel + "</label>" + '<input class="input-mini" type="text" name="daterangepicker_start" value="" disabled="disabled" />' + "</div>" + '<div class="daterangepicker_end_input" >' + '<label for="daterangepicker_end">' + this.locale.toLabel + "</label>" + '<input class="input-mini" type="text" name="daterangepicker_end" value="" disabled="disabled" />' + "</div>" + '<span><input type="button" class="sel Today" value="今天" ><input type="button" class="sel Yesterday" value="昨天" ></span><span><input type="button" class="sel Thisweek" value="本周"><input type="button" value="上周" class="sel Nextweek"></span><span><input type="button" value="最近7天" class="sel Last7Days" ><input type="button" value="最近30天" class="sel Last30days" ></span><span><input type="button" class="sel Thismonth" value="本月"><input type="button" class="sel Nextmonth" value="上月"></span>' + '<span><button class="' + this.applyClass + ' applyBtn" disabled="disabled">' + this.locale.applyLabel + "</button> " + '<button class="' + this.cancelClass + ' cancelBtn">' + this.locale.cancelLabel + "</button><span></div></div></div>";
this.container = e(o).appendTo("body");
if (i) {
typeof n.format == "string" && (this.format = n.format);
typeof n.separator == "string" && (this.separator = n.separator);
typeof n.startDate == "string" && (this.startDate = moment(n.startDate, this.format));
typeof n.endDate == "string" && (this.endDate = moment(n.endDate, this.format));
typeof n.minDate == "string" && (this.minDate = moment(n.minDate, this.format));
typeof n.maxDate == "string" && (this.maxDate = moment(n.maxDate, this.format));
typeof n.startDate == "object" && (this.startDate = moment(n.startDate));
typeof n.endDate == "object" && (this.endDate = moment(n.endDate));
typeof n.minDate == "object" && (this.minDate = moment(n.minDate));
typeof n.maxDate == "object" && (this.maxDate = moment(n.maxDate));
if (typeof n.ranges == "object") {
for (var u in n.ranges) {
var a = moment(n.ranges[u][0]),
f = moment(n.ranges[u][1]);
this.minDate && a.isBefore(this.minDate) && (a = moment(this.minDate));
this.maxDate && f.isAfter(this.maxDate) && (f = moment(this.maxDate));
if (this.minDate && f.isBefore(this.minDate) || this.maxDate && a.isAfter(this.maxDate)) continue;
this.ranges[u] = [a, f]
}
var l = "<ul>";
for (var u in this.ranges) l += "<li>" + u + "</li>";
l += "<li>" + this.locale.customRangeLabel + "</li>";
l += "</ul>";
this.container.find(".ranges").prepend(l)
}
typeof n.dateLimit == "object" && (this.dateLimit = n.dateLimit);
if (typeof n.locale == "object" && typeof n.locale.firstDay == "number") {
this.locale.firstDay = n.locale.firstDay;
var c = n.locale.firstDay;
while (c > 0) {
this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift());
c--
}
}
typeof n.opens == "string" && (this.opens = n.opens);
typeof n.showWeekNumbers == "boolean" && (this.showWeekNumbers = n.showWeekNumbers);
typeof n.buttonClasses == "string" && (this.buttonClasses = [n.buttonClasses]);
typeof n.buttonClasses == "object" && (this.buttonClasses = n.buttonClasses);
typeof n.showDropdowns == "boolean" && (this.showDropdowns = n.showDropdowns);
typeof n.timePicker == "boolean" && (this.timePicker = n.timePicker);
typeof n.timePickerIncrement == "number" && (this.timePickerIncrement = n.timePickerIncrement);
typeof n.timePicker12Hour == "boolean" && (this.timePicker12Hour = n.timePicker12Hour)
}
if (!this.timePicker) {
this.startDate = this.startDate.startOf("day");
this.endDate = this.endDate.startOf("day")
}
var h = this.container;
e.each(this.buttonClasses,
function (e, t) {
h.find("button").addClass(t)
});
if (this.opens == "right") {
var p = this.container.find(".calendar.left"),
d = this.container.find(".calendar.right");
p.removeClass("left").addClass("right");
d.removeClass("right").addClass("left")
}
if (typeof n == "undefined" || typeof n.ranges == "undefined") {
this.container.find(".calendar").show();
this.move()
}
typeof r == "function" && (this.cb = r);
this.container.addClass("opens" + this.opens);
if (!i || typeof n.startDate == "undefined" && typeof n.endDate == "undefined") if (e(this.element).is("input[type=text]")) {
var v = e(this.element).val(),
m = v.split(this.separator),
a,
f, ToDate = new Date().format("yyyy-MM-dd"); ;
if (m.length == 2) {
a = moment(m[0], this.format);
f = moment(m[1], this.format)
}
else {
a = moment(ToDate, this.format);
f = moment(ToDate, this.format)
}
if (a != null && f != null) {
this.startDate = a;
this.endDate = f
}
}
this.oldStartDate = this.startDate.clone();
this.oldEndDate = this.endDate.clone();
this.leftCalendar = {
month: moment([this.startDate.year(), this.startDate.month(), 1, this.startDate.hour(), this.startDate.minute()]),
calendar: []
};
this.rightCalendar = {
month: moment([this.endDate.year(), this.endDate.month(), 1, this.endDate.hour(), this.endDate.minute()]),
calendar: []
};
this.container.on("mousedown", e.proxy(this.mousedown, this));
this.container.find(".calendar").on("click", ".prev", e.proxy(this.clickPrev, this));
this.container.find(".calendar").on("click", ".next", e.proxy(this.clickNext, this));
this.container.find(".ranges").on("click", "button.applyBtn", e.proxy(this.clickApply, this));
this.container.find(".ranges").on("click", "button.cancelBtn", e.proxy(this.clickCancel, this));
this.container.find(".ranges").on("click", ".daterangepicker_start_input", e.proxy(this.showCalendars, this));
this.container.find(".ranges").on("click", ".daterangepicker_end_input", e.proxy(this.showCalendars, this));
this.container.find(".calendar").on("click", "td.available", e.proxy(this.clickDate, this));
this.container.find(".calendar").on("mouseenter", "td.available", e.proxy(this.enterDate, this));
this.container.find(".calendar").on("mouseleave", "td.available", e.proxy(this.updateView, this));
this.container.find(".ranges").on("click", "li", e.proxy(this.clickRange, this));
this.container.find(".ranges").on("mouseenter", "li", e.proxy(this.enterRange, this));
this.container.find(".ranges").on("mouseleave", "li", e.proxy(this.updateView, this));
this.container.find(".calendar").on("change", "select.yearselect", e.proxy(this.updateMonthYear, this));
this.container.find(".calendar").on("change", "select.monthselect", e.proxy(this.updateMonthYear, this));
this.container.find(".calendar").on("change", "select.hourselect", e.proxy(this.updateTime, this));
this.container.find(".calendar").on("change", "select.minuteselect", e.proxy(this.updateTime, this));
this.container.find(".calendar").on("change", "select.ampmselect", e.proxy(this.updateTime, this));
this.element.on("keyup", e.proxy(this.updateFromControl, this));
this.container.find(".ranges").on("click", "input.Today", e.proxy(this.clickToday, this));
this.container.find(".ranges").on("click", "input.Yesterday", e.proxy(this.clickYesterday, this));
this.container.find(".ranges").on("click", "input.Thisweek", e.proxy(this.clickThisweek, this));
this.container.find(".ranges").on("click", "input.Nextweek", e.proxy(this.clickNextweek, this));
this.container.find(".ranges").on("click", "input.Last7Days", e.proxy(this.clickLast7Days, this));
this.container.find(".ranges").on("click", "input.Last30days", e.proxy(this.clickLast30days, this));
this.container.find(".ranges").on("click", "input.Thismonth", e.proxy(this.clickThismonth, this));
this.container.find(".ranges").on("click", "input.Nextmonth", e.proxy(this.clickNextmonth, this));
this.container.find(".ranges").on("click", "span.sel", e.proxy(this.clickAction, this));
this.updateView();
this.updateCalendars()
};
t.prototype = {
constructor: t,
mousedown: function (e) {
e.stopPropagation()
},
updateView: function () {
this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year());
this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year());
this.container.find("input[name=daterangepicker_start]").val(this.startDate.format(this.format).split("T")[0]);
this.container.find("input[name=daterangepicker_end]").val(this.endDate.format(this.format).split("T")[0]);
this.startDate.isSame(this.endDate) || this.startDate.isBefore(this.endDate) ? this.container.find("button.applyBtn").removeAttr("disabled") : this.container.find("button.applyBtn").attr("disabled", "disabled")
},
updateFromControl: function () {
if (!this.element.is("input")) return;
if (!this.element.val().length) return;
var e = this.element.val().split(this.separator),
t = moment(e[0], this.format),
n = moment(e[1], this.format);
if (t == null || n == null) return;
if (n.isBefore(t)) return;
this.startDate = t;
this.endDate = n;
this.notify();
this.updateCalendars()
},
notify: function () {
this.updateView();
this.cb(this.startDate, this.endDate)
},
move: function () {
var t = e(this.container).find(".ranges").outerWidth();
if (e(this.container).find(".calendar").is(":visible")) {
var n = 24;
t += e(this.container).find(".calendar").outerWidth() * 2 + n
}
if (this.opens == "left") {
this.container.css({
top: this.element.offset().top + this.element.outerHeight(),
right: e(window).width() - this.element.offset().left - this.element.outerWidth(),
left: "auto",
"min-width": t
});
this.container.offset().left < 0 && this.container.css({
right: "auto",
left: 9
})
} else {
this.container.css({
top: this.element.offset().top + this.element.outerHeight(),
left: this.element.offset().left,
right: "auto",
"min-width": t
});
this.container.offset().left + this.container.outerWidth() > e(window).width() && this.container.css({
left: "auto",
right: 0
})
}
},
show: function (t) {
this.container.show();
this.move();
if (t) {
t.stopPropagation();
t.preventDefault()
}
e(document).on("mousedown", e.proxy(this.hide, this));
this.element.trigger("shown", {
target: t.target,
picker: this
})
},
hide: function (t) {
this.container.hide();
(!this.startDate.isSame(this.oldStartDate) || !this.endDate.isSame(this.oldEndDate)) && this.notify();
this.oldStartDate = this.startDate.clone();
this.oldEndDate = this.endDate.clone();
e(document).off("mousedown", this.hide);
this.element.trigger("hidden", {
picker: this
})
},
enterRange: function (e) {
var t = e.target.innerHTML;
if (t == this.locale.customRangeLabel) this.updateView();
else {
var n = this.ranges[t];
this.container.find("input[name=daterangepicker_start]").val(n[0].format(this.format).split("T")[0]);
this.container.find("input[name=daterangepicker_end]").val(n[1].format(this.format).split("T")[0])
}
},
showCalendars: function () {
this.container.find(".calendar").show();
this.move()
},
updateInputText: function () {
this.element.is("input") && this.element.val(this.startDate.format(this.format).split("T")[0] + this.separator + this.endDate.format(this.format).split("T")[0])
},
clickRange: function (e) {
var t = e.target.innerHTML;
if (t == this.locale.customRangeLabel) this.showCalendars();
else {
var n = this.ranges[t];
this.startDate = n[0];
this.endDate = n[1];
if (!this.timePicker) {
this.startDate.startOf("day");
this.endDate.startOf("day")
}
this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year()).hour(this.startDate.hour()).minute(this.startDate.minute());
this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year()).hour(this.endDate.hour()).minute(this.endDate.minute());
this.updateCalendars();
this.updateInputText();
this.container.find(".calendar").hide();
this.hide()
}
},
clickPrev: function (t) {
var n = e(t.target).parents(".calendar");
n.hasClass("left") ? this.leftCalendar.month.subtract("month", 1) : this.rightCalendar.month.subtract("month", 1);
this.updateCalendars()
},
clickNext: function (t) {
var n = e(t.target).parents(".calendar");
n.hasClass("left") ? this.leftCalendar.month.add("month", 1) : this.rightCalendar.month.add("month", 1);
this.updateCalendars()
},
enterDate: function (t) {
var n = e(t.target).attr("data-title"),
r = n.substr(1, 1),
i = n.substr(3, 1),
s = e(t.target).parents(".calendar");
s.hasClass("left") ? this.container.find("input[name=daterangepicker_start]").val(this.leftCalendar.calendar[r][i].format(this.format).split("T")[0]) : this.container.find("input[name=daterangepicker_end]").val(this.rightCalendar.calendar[r][i].format(this.format).split("T")[0])
},
clickDate: function (t) {
var n = e(t.target).attr("data-title"),
r = n.substr(1, 1),
i = n.substr(3, 1),
s = e(t.target).parents(".calendar");
if (s.hasClass("left")) {
var o = this.leftCalendar.calendar[r][i],
u = this.endDate;
if (typeof this.dateLimit == "object") {
var a = moment(o).add(this.dateLimit).startOf("day");
u.isAfter(a) && (u = a)
}
} else {
var o = this.startDate,
u = this.rightCalendar.calendar[r][i];
if (typeof this.dateLimit == "object") {
var f = moment(u).subtract(this.dateLimit).startOf("day");
o.isBefore(f) && (o = f)
}
}
s.find("td").removeClass("active");
if (o.isSame(u) || o.isBefore(u)) {
e(t.target).addClass("active");
this.startDate = o;
this.endDate = u
} else if (o.isAfter(u)) {
e(t.target).addClass("active");
this.startDate = o;
this.endDate = moment(o).add("day", 1).startOf("day")
}
this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year());
this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year());
this.updateCalendars()
},
clickApply: function (e) {
this.updateInputText();
this.hide()
},
clickCancel: function (e) {
this.startDate = this.oldStartDate;
this.endDate = this.oldEndDate;
this.updateView();
this.updateCalendars();
this.hide()
},
updateMonthYear: function (t) {
var n = e(t.target).closest(".calendar").hasClass("left"),
r = this.container.find(".calendar.left");
n || (r = this.container.find(".calendar.right"));
var i = r.find(".monthselect").val(),
s = r.find(".yearselect").val();
n ? this.leftCalendar.month.month(i).year(s) : this.rightCalendar.month.month(i).year(s);
this.updateCalendars()
},
updateTime: function (t) {
var n = e(t.target).closest(".calendar").hasClass("left"),
r = this.container.find(".calendar.left");
n || (r = this.container.find(".calendar.right"));
var i = parseInt(r.find(".hourselect").val()),
s = parseInt(r.find(".minuteselect").val());
if (this.timePicker12Hour) {
var o = r.find(".ampmselect").val();
o == "PM" && i < 12 && (i += 12);
o == "AM" && i == 12 && (i = 0)
}
if (n) {
var u = this.startDate;
u.hour(i);
u.minute(s);
this.startDate = u;
this.leftCalendar.month.hour(i).minute(s)
} else {
var a = this.endDate;
a.hour(i);
a.minute(s);
this.endDate = a;
this.rightCalendar.month.hour(i).minute(s)
}
this.updateCalendars()
},
updateCalendars: function () {
this.leftCalendar.calendar = this.buildCalendar(this.leftCalendar.month.month(), this.leftCalendar.month.year(), this.leftCalendar.month.hour(), this.leftCalendar.month.minute(), "left");
this.rightCalendar.calendar = this.buildCalendar(this.rightCalendar.month.month(), this.rightCalendar.month.year(), this.rightCalendar.month.hour(), this.rightCalendar.month.minute(), "right");
this.container.find(".calendar.left").html(this.renderCalendar(this.leftCalendar.calendar, this.startDate, this.minDate, this.maxDate));
this.container.find(".calendar.right").html(this.renderCalendar(this.rightCalendar.calendar, this.endDate, this.startDate, this.maxDate));
this.container.find(".ranges li").removeClass("active");
var e = !0,
t = 0;
for (var n in this.ranges) {
if (this.timePicker) {
if (this.startDate.isSame(this.ranges[n][0]) && this.endDate.isSame(this.ranges[n][1])) {
e = !1;
this.container.find(".ranges li:eq(" + t + ")").addClass("active")
}
} else if (this.startDate.format("YYYY-MM-DD") == this.ranges[n][0].format("YYYY-MM-DD") && this.endDate.format("YYYY-MM-DD") == this.ranges[n][1].format("YYYY-MM-DD")) {
e = !1;
this.container.find(".ranges li:eq(" + t + ")").addClass("active")
}
t++
}
e && this.container.find(".ranges li:last").addClass("active")
},
buildCalendar: function (e, t, n, r, i) {
var s = moment([t, e, 1]),
o = moment(s).subtract("month", 1).month(),
u = moment(s).subtract("month", 1).year(),
a = moment([u, o]).daysInMonth(),
f = s.day(),
l = [];
for (var c = 0; c < 6; c++) l[c] = [];
var h = a - f + this.locale.firstDay + 1;
h > a && (h -= 7);
f == this.locale.firstDay && (h = a - 6);
var p = moment([u, o, h, n, r]);
for (var c = 0, d = 0, v = 0; c < 42; c++, d++, p = moment(p).add("day", 1)) {
if (c > 0 && d % 7 == 0) {
d = 0;
v++
}
l[v][d] = p
}
return l
},
renderDropdowns: function (e, t, n) {
var r = e.month(),
i = '<select class="monthselect">',
s = !1,
o = !1;
for (var u = 0; u < 12; u++) (!s || u >= t.month()) && (!o || u <= n.month()) && (i += "<option value='" + u + "'" + (u === r ? " selected='selected'" : "") + ">" + this.locale.monthNames[u] + "</option>");
i += "</select>";
var a = e.year(),
f = n && n.year() || a + 5,
l = t && t.year() || a - 50,
c = '<select class="yearselect">';
for (var h = l; h <= f; h++) c += '<option value="' + h + '"' + (h === a ? ' selected="selected"' : "") + ">" + h + "</option>";
c += "</select>";
return i + c
},
renderCalendar: function (t, n, r, i) {
var s = '<div class="calendar-date">';
s += '<table class="table-condensed">';
s += "<thead>";
s += "<tr>";
this.showWeekNumbers && (s += "<th></th>"); !r || r.isBefore(t[1][1]) ? s += '<th class="prev available"><i class="icon-arrow-left glyphicon glyphicon-arrow-left"></i></th>' : s += "<th></th>";
var o = this.locale.monthNames[t[1][1].month()] + t[1][1].format(" YYYY");
this.showDropdowns && (o = this.renderDropdowns(t[1][1], r, i));
s += '<th colspan="5" style="width: auto">' + o + "</th>"; !i || i.isAfter(t[1][1]) ? s += '<th class="next available"><i class="icon-arrow-right glyphicon glyphicon-arrow-right"></i></th>' : s += "<th></th>";
s += "</tr>";
s += "<tr>";
this.showWeekNumbers && (s += '<th class="week">' + this.locale.weekLabel + "</th>");
e.each(this.locale.daysOfWeek,
function (e, t) {
s += "<th>" + t + "</th>"
});
s += "</tr>";
s += "</thead>";
s += "<tbody>";
for (var u = 0; u < 6; u++) {
s += "<tr>";
this.showWeekNumbers && (s += '<td class="week">' + t[u][0].week() + "</td>");
for (var a = 0; a < 7; a++) {
var f = "available ";
f += t[u][a].month() == t[1][1].month() ? "" : "off";
if (r && t[u][a].isBefore(r) || i && t[u][a].isAfter(i)) f = " off disabled ";
else if (t[u][a].format("YYYY-MM-DD") == n.format("YYYY-MM-DD")) {
f += " active ";
t[u][a].format("YYYY-MM-DD") == this.startDate.format("YYYY-MM-DD") && (f += " start-date ");
t[u][a].format("YYYY-MM-DD") == this.endDate.format("YYYY-MM-DD") && (f += " end-date ")
} else if (t[u][a] >= this.startDate && t[u][a] <= this.endDate) {
f += " in-range ";
t[u][a].isSame(this.startDate) && (f += " start-date ");
t[u][a].isSame(this.endDate) && (f += " end-date ")
}
var l = "r" + u + "c" + a;
s += '<td class="' + f.replace(/\s+/g, " ").replace(/^\s?(.*?)\s?$/, "$1") + '" data-title="' + l + '">' + t[u][a].date() + "</td>"
}
s += "</tr>"
}
s += "</tbody>";
s += "</table>";
s += "</div>";
if (this.timePicker) {
s += '<div class="calendar-time">';
s += '<select class="hourselect">';
var c = 0,
h = 23,
p = n.hour();
if (this.timePicker12Hour) {
c = 1;
h = 12;
p >= 12 && (p -= 12);
p == 0 && (p = 12)
}
for (var d = c; d <= h; d++) d == p ? s += '<option value="' + d + '" selected="selected">' + d + "</option>" : s += '<option value="' + d + '">' + d + "</option>";
s += "</select> : ";
s += '<select class="minuteselect">';
for (var d = 0; d < 60; d += this.timePickerIncrement) {
var v = d;
v < 10 && (v = "0" + v);
d == n.minute() ? s += '<option value="' + d + '" selected="selected">' + v + "</option>" : s += '<option value="' + d + '">' + v + "</option>"
}
s += "</select> ";
if (this.timePicker12Hour) {
s += '<select class="ampmselect">';
n.hour() >= 12 ? s += '<option value="AM">AM</option><option value="PM" selected="selected">PM</option>' : s += '<option value="AM" selected="selected">AM</option><option value="PM">PM</option>';
s += "</select>"
}
s += "</div>"
}
return s
},
clickToday: function () {
var StratDate = new Date().format("yyyy-MM-dd");
this.clickContainer(StratDate, StratDate, arguments[0].target);
},
clickYesterday: function () {
var StratDate = Convert.toDateTime(this.GetDateStr(-1)).format("yyyy-MM-dd");
this.clickContainer(StratDate, StratDate, arguments[0].target);
},
clickThisweek: function () {
//获取当前时间
var currentDate = new Date();
//返回date是一周中的某一天
var week = currentDate.getDay();
//一天的毫秒数
var millisecond = 1000 * 60 * 60 * 24;
//减去的天数
var minusDay = week != 0 ? week - 1 : 6;
//alert(minusDay);
//本周 周一
var StratDate = new Date(new Date().getTime() - (minusDay * millisecond)).format("yyyy-MM-dd");
var LastDate = new Date().format("yyyy-MM-dd");
this.clickContainer(StratDate, LastDate, arguments[0].target);
},
clickNextweek: function () {
//起止日期数组
var startStop = new Array();
//获取当前时间
var currentDate = new Date();
//返回date是一周中的某一天
var week = currentDate.getDay();
//返回date是一个月中的某一天
var month = currentDate.getDate();
//一天的毫秒数
var millisecond = 1000 * 60 * 60 * 24;
//减去的天数
var minusDay = week != 0 ? week - 1 : 6;
//获得当前周的第一天
var currentWeekDayOne = new Date(currentDate.getTime() - (millisecond * minusDay));
//上周最后一天即本周开始的前一天
var LastDate = new Date(currentWeekDayOne.getTime() - millisecond).format("yyyy-MM-dd");
//上周的第一天
var StratDate = new Date(new Date(currentWeekDayOne.getTime() - millisecond).getTime() - (millisecond * 6)).format("yyyy-MM-dd");
this.clickContainer(StratDate, LastDate, arguments[0].target);
},
clickLast7Days: function () {
var LastDate = new Date().format("yyyy-MM-dd");
var StratDate = Convert.toDateTime(this.GetDateStr(-7)).format("yyyy-MM-dd");
this.clickContainer(StratDate, LastDate, arguments[0].target);
},
clickLast30days: function () {
var LastDate = new Date().format("yyyy-MM-dd");
var StratDate = Convert.toDateTime(this.GetDateStr(-30)).format("yyyy-MM-dd");
this.clickContainer(StratDate, LastDate, arguments[0].target);
},
clickThismonth: function () {
var LastDate = new Date().format("yyyy-MM-dd");
var StratDate = new Date(new Date().getFullYear() + "-" + parseInt(new Date().getMonth() + 1) + "-01").format("yyyy-MM-dd");
this.clickContainer(StratDate, LastDate, arguments[0].target);
},
clickNextmonth: function () {
var millisecond = 1000 * 60 * 60 * 24;
var nextMonthDayOne = new Date(new Date().getFullYear() + "-" + parseInt(new Date().getMonth() + 1) + "-01")
var LastDate = new Date(nextMonthDayOne.getTime() - millisecond).format("yyyy-MM-dd");
var StratDate = new Date(new Date().getFullYear() + "-" + new Date().getMonth() + "-01").format("yyyy-MM-dd");
this.clickContainer(StratDate, LastDate, arguments[0].target);
},
clickAction: function () {
},
GetDateStr: function (AddDayCount) {
var dd = new Date();
dd.setDate(dd.getDate() + AddDayCount); //获取AddDayCount天后的日期
var y = dd.getFullYear();
var m = dd.getMonth() + 1; //获取当前月份的日期
var d = dd.getDate();
return y + "-" + m + "-" + d;
},
clickContainer: function (StratDate, LastDate, obj) {
$("span .sel").each(function () {
console.log(this);
$(this).removeClass("action");
});
$(obj).addClass("action");
this.container.find("input[name=daterangepicker_start]").val(StratDate);
this.container.find("input[name=daterangepicker_end]").val(LastDate);
var strat = moment(StratDate, this.format);
var laset = moment(LastDate, this.format);
if (strat != null && laset != null) {
this.startDate = strat;
this.endDate = laset
}
this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year());
this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year());
this.updateCalendars()
}
};
e.fn.daterangepicker = function (n, r) {
this.each(function () {
var i = e(this);
i.data("daterangepicker") || i.data("daterangepicker", new t(i, n, r))
});
return this
}
/**
* @param d the delimiter
* @param p the pattern of your date
* @author meizz
* @author kimsoft add w+ pattern
*/
Date.prototype.format = function (style) {
var o = {
"M+": this.getMonth() + 1, //month
"d+": this.getDate(), //day
"h+": this.getHours(), //hour
"m+": this.getMinutes(), //minute
"s+": this.getSeconds(), //second
"w+": "\u65e5\u4e00\u4e8c\u4e09\u56db\u4e94\u516d".charAt(this.getDay()), //week
"q+": Math.floor((this.getMonth() + 3) / 3), //quarter
"S": this.getMilliseconds() //millisecond
}
if (/(y+)/.test(style)) {
style = style.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
}
for (var k in o) {
if (new RegExp("(" + k + ")").test(style)) {
style = style.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));
}
}
return style;
};
/**
* @param d the delimiter
* @param p the pattern of your date
* @rebuilder kimsoft
* @version build 2006.12.15
*/
String.prototype.toDate = function (delimiter, pattern) {
delimiter = delimiter || "-";
pattern = pattern || "ymd";
var a = this.split(delimiter);
var y = parseInt(a[pattern.indexOf("y")], 10);
//remember to change this next century ;)
if (y.toString().length <= 2) y += 2000;
if (isNaN(y)) y = new Date().getFullYear();
var m = parseInt(a[pattern.indexOf("m")], 10) - 1;
var d = parseInt(a[pattern.indexOf("d")], 10);
if (isNaN(d)) d = 1;
return new Date(y, m, d);
};
var Convert = {
toDateTime: function (str) {//转换成日期时间格式
if ($.isNullOrEmpty(str)) {
return null;
}
if (/\d*年\d*月\d*日/.test(str)) {//如:2012年06月04日
return new Date(str.replace(/年/g, "/").replace(/月/g, "/").replace(/日/g, " "));
}
else if (/\d*-\d*-\d*/.test(str)) {//如:2012-06-04
if (str.indexOf("+") > 0) {
return new Date(Date.parse(str));
}
else {
return new Date(str.replace(/-/g, "/").replace(/T/, " "));
}
}
else if (/\d*\/\d*\/\d*/.test(str)) {//如:2012/06/04
return new Date(str);
}
else if (/\/Date\([-\d]*\)\//.test(str)) {//如:/Date(7894565245)/
return new Date(parseInt(str.replace("/", "")
.replace("Date", "")
.replace("(", "")
.replace(")")
.replace("/", "")
));
}
else {
if (isNaN(Date.parse(str))) {
return null;
}
return new Date(Date.parse(str));
}
}
}
//判断字符串是否为空白字符
$.isNullOrEmpty = function (str) {
return str == null || str == undefined || $.trim(str.toString()) == "";
}
$.isNull = function (str) {
return str == null || str == undefined;
}
} (window.jQuery);
页面样式
body {
color: #3b3b41;
border: 0;
font-size: 14px;
font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;
}
* {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
:before, :after {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
th {
text-align: left;
}
td, th {
padding: 0;
}
button, html input[type=button], input[type=reset], input[type=submit] {
-webkit-appearance: button;
cursor: pointer;
}
button, input, optgroup, select, textarea {
color: inherit;
font: inherit;
margin: 0;
}
button {
overflow: visible;
}
button, select {
text-transform: none;
}
/*********日历控件*************/
.dropdown-menu {
position: absolute;
top: 100%;
left: 0;
z-index: 1000;
display: none;
float: left;
min-width: 160px;
padding: 5px 0;
margin: 2px 0 0;
list-style: none;
font-size: 14px;
background-color: #fff;
border: 1px solid #ccc;
border: 1px solid rgba(0,0,0,.15);
-webkit-box-shadow: 0 6px 12px rgba(0,0,0,.175);
box-shadow: 0 6px 12px rgba(0,0,0,.175);
background-clip: padding-box;
}
.daterangepicker {
position: absolute;
background: #fff;
top: 100px;
left: 20px;
padding: 4px;
margin-top: 1px;
}
.daterangepicker.opensright:before {
position: absolute;
top: -7px;
left: 9px;
display: inline-block;
border-right: 7px solid transparent;
border-bottom: 7px solid #ccc;
border-left: 7px solid transparent;
border-bottom-color: rgba(0,0,0,0.2);
content: '';
}
.daterangepicker.opensright:after {
position: absolute;
top: -6px;
left: 10px;
display: inline-block;
border-right: 6px solid transparent;
border-bottom: 6px solid #fff;
border-left: 6px solid transparent;
content: '';
}
.daterangepicker.opensright .ranges, .daterangepicker.opensright .calendar {
float: right;
margin: 4px;
}
.daterangepicker .calendar {
display: none;
max-width: 270px;
}
.daterangepicker .calendar-date {
border: 1px solid #ddd;
padding: 4px;
background: #fff;
}
.daterangepicker table {
width: 100%;
margin: 0;
}
.table-condensed>thead>tr>th, .table-condensed>tbody>tr>th, .table-condensed>tfoot>tr>th, .table-condensed>thead>tr>td, .table-condensed>tbody>tr>td, .table-condensed>tfoot>tr>td {
padding: 5px;
}
table {
max-width: 100%;
background-color: transparent;
border-collapse: collapse;
border-spacing: 0;
}
thead {
display: table-header-group;
vertical-align: middle;
border-color: inherit;
}
tr {
display: table-row;
vertical-align: inherit;
border-color: inherit;
}
.daterangepicker .calendar th, .daterangepicker .calendar td {
font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif;
white-space: nowrap;
text-align: center;
min-width: 32px;
}
.daterangepicker td, .daterangepicker th {
text-align: center;
width: 20px;
height: 20px;
cursor: pointer;
white-space: nowrap;
}
.glyphicon {
position: relative;
top: 1px;
display: inline-block;
font-family: 'Glyphicons Halflings';
font-style: normal;
font-weight: 400;
line-height: 1;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.daterangepicker td.in-range {
background: #ebf4f8;
}
.daterangepicker td.off {
color: #999;
}
.daterangepicker td.active, .daterangepicker td.active:hover {
background-color: #67c2ef;
border-color: #3071a9;
color: #fff;
}
.daterangepicker.opensright .ranges, .daterangepicker.opensright .calendar {
float: right;
margin: 4px;
}
.daterangepicker .ranges {
width: 180px;
text-align: left;
}
.daterangepicker .ranges .range_inputs>div {
float: left;
}
.daterangepicker .ranges label {
color: #333;
display: block;
font-size: 11px;
font-weight: normal;
height: 20px;
line-height: 20px;
margin-bottom: 1px;
text-shadow: #fff 1px 1px 0;
text-transform: uppercase;
width: 74px;
}
.daterangepicker .ranges .input-mini {
background-color: #eee;
border: 1px solid #ccc;
color: #555;
display: block;
font-size: 11px;
height: 30px;
line-height: 30px;
vertical-align: middle;
margin: 0 10px 0 0;
padding: 0 6px;
width: 80px;
}
button {
height: 30px;
border: 1px solid #eee;
width: 180px;
padding-left: 10px;
}
input,select {
height: 35px;
border: 1px solid #eee;
max-width: 180px;
padding-left: 10px;
}
input.sel, button.sel {
border: solid 0px #ccc;
cursor: pointer;
background-color: #FFFFFF;
color: #000000;
min-width: 85px;
width:auto;
padding: 2px;
text-align: center;
}
input.sel:hover {
background:#357EBD;
color: #fff;
}
button.applyBtn {
background: #357EBD;
color: #fff;
}
button.applyBtn:hover {
background: #59a9ef;
color: #fff;
}
button.cancelBtn {
background:#fff;
color: #000;
border:1px solid #eee;
}
.range_inputs span
{
display:inline-block;
margin: 2px;
}
input.action {
background:#357EBD;
color: #fff;
}
/*********页面代码********/
form{ text-align:center;}
form a
{
display: inline-block;
padding: 8px 12px;
border: 1px solid #eee;
text-decoration: none;
font-size: 14px;
color:#000;
}
form a:hover {
background:#357EBD;
color: #fff;
}
form a.action {
background:#357EBD;
color: #fff;
}
<input type="text" id="daterange" value="2014-03-01 - 2014-03-20">
$('#daterange').daterangepicker();