zent
Version:
一套前端设计语言和基于React的实现
164 lines (153 loc) • 5.92 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
var token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g;
var timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g;
var timezoneClip = /[^-+\dA-Z]/g;
var pad = function pad(val, len) {
val = String(val);
len = len || 2;
while (val.length < len) {
val = '0' + val;
}return val;
};
var dateI18n = {
en: {
dayNames: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
monthNames: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
},
zh: {
dayNames: ['周日', '周一', '周二', '周三', '周四', '周五', '周六', '星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
monthNames: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月', '一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月']
}
};
var dateMasks = {
'default': 'ddd mmm dd yyyy HH:MM:ss',
shortDate: 'm/d/yy',
mediumDate: 'mmm d, yyyy',
longDate: 'mmmm d, yyyy',
fullDate: 'dddd, mmmm d, yyyy',
shortTime: 'h:MM TT',
mediumTime: 'h:MM:ss TT',
longTime: 'h:MM:ss TT Z',
isoDate: 'yyyy-mm-dd',
isoTime: 'HH:MM:ss',
isoDateTime: "yyyy-mm-dd'T'HH:MM:ss",
isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"
};
var getFlags = function getFlags(date, utc, locale) {
var _ = utc ? 'getUTC' : 'get';
var d = date[_ + 'Date']();
var D = date[_ + 'Day']();
var m = date[_ + 'Month']();
var y = date[_ + 'FullYear']();
var H = date[_ + 'Hours']();
var M = date[_ + 'Minutes']();
var s = date[_ + 'Seconds']();
var L = date[_ + 'Milliseconds']();
var o = utc ? 0 : date.getTimezoneOffset();
var flags = {
d: d,
dd: pad(d),
ddd: dateI18n[locale].dayNames[D],
dddd: dateI18n[locale].dayNames[D + 7],
m: m + 1,
mm: pad(m + 1),
mmm: dateI18n[locale].monthNames[m],
mmmm: dateI18n[locale].monthNames[m + 12],
yy: String(y).slice(2),
yyyy: y,
h: H % 12 || 12,
hh: pad(H % 12 || 12),
H: H,
HH: pad(H),
M: M,
MM: pad(M),
s: s,
ss: pad(s),
l: pad(L, 3),
L: pad(L > 99 ? Math.round(L / 10) : L),
t: H < 12 ? 'a' : 'p',
tt: H < 12 ? 'am' : 'pm',
T: H < 12 ? 'A' : 'P',
TT: H < 12 ? 'AM' : 'PM',
Z: utc ? 'UTC' : (String(date).match(timezone) || ['']).pop().replace(timezoneClip, ''),
o: (o > 0 ? '-' : '+') + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),
S: ['th', 'st', 'nd', 'rd'][d % 10 > 3 ? 0 : (d % 100 - d % 10 !== 10) * d % 10]
};
return flags;
};
exports['default'] = {
/**
* 时间格式化
* @param {Date} date 待格式化的时间
* @param {string} mask 格式化字符串
* @param {Object} options 高级选项,可以指定locale,utc
* @return {string} 格式化后的字符串
*
* 支持的格式化选项包括:
* 年:yy(97), yyyy(1997)
* 月:m(1), mm(01), mmm(1月), mmmm(一月)
* 日:d(5), dd(05), ddd(周五),dddd(星期五)
* 小时:h(2), hh(02), H(14), HH(14),小写是12小时制,大写是24小时制
* 分:M(3), MM(03),
* 秒:s(8), ss(08)
* 毫秒:l(056), L(56), l三位,L两位
*
* 其他:
* t, tt, T, TT: a/p, am/pm, A/P, AM/PM
* Z: 时区, UTC, CST等
* o: 时区offset: +0800
* S: 英语中的序数:st, nd, rd或th,一般和d一起使用
*/
formatDate: function formatDate(date, mask, options) {
options = options || {};
var utc = options.utc || false;
var locale = options.locale || 'zh';
// You can't provide utc if you skip other args (use the "UTC:" mask prefix)
// eslint-disable-next-line
if (arguments.length === 1 && Object.prototype.toString.call(date) === '[object String]' && !/\d/.test(date)) {
mask = date;
date = undefined;
}
mask = dateMasks[mask] || mask || dateMasks['default'];
// Passing date through Date applies Date.parse, if necessary
date = date ? new Date(date) : new Date();
// Boolean(NaN) return false, so the check of isNaN(date) is useless.
// new Date(NaN) will throw a SyntaxError in Browser
// if (isNaN(date)) throw new SyntaxError('invalid date');
// Allow setting the utc argument via the mask
if (mask.slice(0, 4) === 'UTC:') {
mask = mask.slice(4);
utc = true;
}
var flags = getFlags(date, utc, locale);
return mask.replace(token, function ($0) {
return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
});
},
parseDate: function parseDate(date, mask) {
mask = dateMasks[mask] || mask || dateMasks['default'];
if (typeof date === 'number') return new Date(date);
if (date instanceof Date) return date;
var arr = [];
mask.replace(token, function ($0) {
arr.push($0);
});
var regArr = arr.map(function (item) {
return '(\\d{' + item.length + '})';
});
var regStr = regArr.join('[^\\d]?');
var dateArr = String(date).match(new RegExp(regStr));
if (!dateArr || dateArr.length !== arr.length + 1) {
return;
}
dateArr = dateArr.splice(1);
var tmp = new (Function.prototype.bind.apply(Date, [null].concat(_toConsumableArray(dateArr))))();
tmp.setMonth(tmp.getMonth() - 1);
return tmp;
}
};
module.exports = exports['default'];
;