util.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544
  1. const formatTime = date => {
  2. const year = date.getFullYear();
  3. const month = date.getMonth() + 1;
  4. const day = date.getDate();
  5. const hour = date.getHours();
  6. const minute = date.getMinutes();
  7. const second = date.getSeconds();
  8. var t1 = [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(
  9. ':');
  10. var t2 = [year, month, day].map(formatNumber).join('-');
  11. var t3 = [year, month, day].map(formatNumber).join('-');
  12. var time = {
  13. t1: t1,
  14. t2: t2,
  15. t3: t3
  16. };
  17. return time;
  18. };
  19. /**
  20. * 获取上一个月
  21. *
  22. * @date 格式为yyyy-mm-dd的日期,如:2014-01-25
  23. */
  24. const getPreMonth = date => {
  25. var arr = date.split('-');
  26. var year = arr[0]; //获取当前日期的年份
  27. var month = arr[1]; //获取当前日期的月份
  28. var day = arr[2]; //获取当前日期的日
  29. var days = new Date(year, month, 0);
  30. days = days.getDate(); //获取当前日期中月的天数
  31. var year2 = year;
  32. var month2 = parseInt(month) - 1;
  33. if (month2 == 0) {
  34. //如果是1月份,则取上一年的12月份
  35. year2 = parseInt(year2) - 1;
  36. month2 = 12;
  37. }
  38. var day2 = day;
  39. var days2 = new Date(year2, month2, 0);
  40. days2 = days2.getDate();
  41. if (day2 > days2) {
  42. //如果原来日期大于上一月的日期,则取当月的最大日期。比如3月的30日,在2月中没有30
  43. day2 = days2;
  44. }
  45. if (month2 < 10) {
  46. month2 = '0' + month2; //月份填补成2位。
  47. }
  48. var t1 = year + '-' + month;
  49. var t2 = year2 + '-' + month2;
  50. var time = {
  51. t1: t1,
  52. t2: t2
  53. };
  54. return time;
  55. };
  56. const formatNumber = n => {
  57. n = n.toString();
  58. return n[1] ? n : '0' + n;
  59. };
  60. const formatTimes = t => {
  61. let second = t % 60;
  62. let minute = parseInt(t / 60 % 60);
  63. let hour = parseInt(t / 60 / 60);
  64. return formatNumber(hour) + ':' + formatNumber(minute) + ":" + formatNumber(second);
  65. };
  66. const formatDayTimes = t => {
  67. let second = t % 60;
  68. let minute = parseInt(t / 60 % 60);
  69. let hour = parseInt(t / 60 / 60 % 24);
  70. let day = parseInt(t / 60 / 60 / 24);
  71. return formatNumber(day) + '天' + formatNumber(hour) + ':' + formatNumber(minute) + ":" + formatNumber(second);
  72. };
  73. /**
  74. * 判断此对象是否是Object类型
  75. * @param {Object} obj
  76. */
  77. function isObject(obj) {
  78. return Object.prototype.toString.call(obj) === '[object Object]';
  79. }
  80. ;
  81. /**
  82. * 判断此类型是否是Array类型
  83. * @param {Array} arr
  84. */
  85. function isArray(arr) {
  86. return Object.prototype.toString.call(arr) === '[object Array]';
  87. }
  88. ;
  89. /**
  90. * 深度比较两个对象是否相同
  91. * @param {Object} oldData
  92. * @param {Object} newData
  93. */
  94. function equalsObj(oldData, newData) {
  95. // 类型为基本类型时,如果相同,则返回true
  96. if (oldData === newData) return true;
  97. if (isObject(oldData) && isObject(newData) && Object.keys(oldData).length === Object.keys(newData).length) {
  98. // 类型为对象并且元素个数相同
  99. // 遍历所有对象中所有属性,判断元素是否相同
  100. for (const key in oldData) {
  101. if (oldData.hasOwnProperty(key)) {
  102. if (!equalsObj(oldData[key], newData[key])) // 对象中具有不相同属性 返回false
  103. return false;
  104. }
  105. }
  106. } else if (isArray(oldData) && isArray(oldData) && oldData.length === newData.length) {
  107. // 类型为数组并且数组长度相同
  108. for (let i = 0, length = oldData.length; i < length; i++) {
  109. if (!equalsObj(oldData[i], newData[i])) // 如果数组元素中具有不相同元素,返回false
  110. return false;
  111. }
  112. } else {
  113. // 其它类型,均返回false
  114. return false;
  115. } // 走到这里,说明数组或者对象中所有元素都相同,返回true
  116. return true;
  117. }
  118. ; //时间戳转化
  119. function transTime(date) {
  120. var date = new Date(parseInt(date) * 1000);
  121. var year = date.getFullYear();
  122. var month = date.getMonth() + 1;
  123. var day = date.getDate();
  124. var hour = date.getHours();
  125. var minute = date.getMinutes();
  126. var second = date.getSeconds();
  127. return [year, month, day].map(formatNumber).join('-') + ' ' + [hour, minute, second].map(formatNumber).join(':');
  128. }
  129. ; // 节流
  130. function throttle(fn, gapTime) {
  131. if (gapTime == null || gapTime == undefined) {
  132. gapTime = 1500;
  133. }
  134. let _lastTime = null; // 返回新的函数
  135. return function() {
  136. let _nowTime = +new Date();
  137. if (_nowTime - _lastTime > gapTime || !_lastTime) {
  138. fn.apply(this, arguments); //将this和参数传给原函数
  139. _lastTime = _nowTime;
  140. }
  141. };
  142. };
  143. const isMobile = (value) => {
  144. var reg = /^1[3|4|5|6|7|8|9][0-9]{9}$/; //验证规则
  145. var flag = reg.test(value);
  146. if (!flag) {
  147. return false
  148. } else {
  149. return true
  150. }
  151. }
  152. const convertUrlObj=(data)=> {
  153. var _result = [];
  154. for (var key in data) {
  155. var value = data[key];
  156. if (value.constructor == Array) {
  157. value.forEach(function(_value) {
  158. _result.push(key + "=" + _value);
  159. });
  160. } else {
  161. _result.push(key + '=' + value);
  162. }
  163. }
  164. console.log('Obj==',_result.join('&'))
  165. return _result.join('&');
  166. }
  167. // 隐藏手机号中间四位
  168. function styleHintText(tel) {
  169. if (tel) {
  170. var reg = /^(\d{6})\d{8}(\d{4})$/;
  171. tel = tel.replace(reg, "$1********$2");
  172. }
  173. return tel;
  174. }
  175. function getDateDiff(dateTimeStamp){
  176. var minute = 1000 * 60;
  177. var hour = minute * 60;
  178. var day = hour * 24;
  179. var halfamonth = day * 15;
  180. var month = day * 30;
  181. var now = new Date().getTime();
  182. var diffValue = now - dateTimeStamp;
  183. if(diffValue < 0){return;}
  184. var monthC =diffValue/month;
  185. var weekC =diffValue/(7*day);
  186. var dayC =diffValue/day;
  187. var hourC =diffValue/hour;
  188. var minC =diffValue/minute;
  189. if(monthC>=1){
  190. result="" + parseInt(monthC) + "月前";
  191. }
  192. else if(weekC>=1){
  193. result="" + parseInt(weekC) + "周前";
  194. }
  195. else if(dayC>=1){
  196. result=""+ parseInt(dayC) +"天前";
  197. }
  198. else if(hourC>=1){
  199. result=""+ parseInt(hourC) +"小时前";
  200. }
  201. else if(minC>=1){
  202. result=""+ parseInt(minC) +"分钟前";
  203. }else
  204. result="刚刚";
  205. return result;
  206. }
  207. function formatNumbers(num) {
  208. if (num >= 1e4) {
  209. return parseInt(num / 1e4).toFixed(0) + 'w+'
  210. } else if (num >= 999) {
  211. return '999+'
  212. } else if (num >= 99) {
  213. return '99+'
  214. } else {
  215. return num
  216. }
  217. }
  218. // 金钱
  219. function toDecimal(x) {
  220. var f = Math.round(x * 100) / 100;
  221. var s = f.toString();
  222. var rs = s.indexOf('.');
  223. if (rs < 0) {
  224. rs = s.length;
  225. s += '.';
  226. }
  227. while (s.length <= rs + 2) {
  228. s += '0';
  229. }
  230. return s;
  231. }
  232. // 时间字符串返回时分
  233. function captureTime(time,isTime){
  234. var fullTime = time; // 日期字符串
  235. // console.log(fullTime + '----');
  236. var timeArr = fullTime.replace(" ", ":").replace(/\:/g, "-").split("-");
  237. var nian = timeArr[0];
  238. var yue = timeArr[1];
  239. var ri = timeArr[2];
  240. var shi = timeArr[3];
  241. var fen = timeArr[4];
  242. var miao = timeArr[5];
  243. // console.log(nian + '-' + yue + '-' + ri + ' ' + shi + ':' + fen + ':' + miao);
  244. var str = shi + ':' + fen;
  245. var date =nian + '-' + yue + '-' + ri;
  246. // var str = yue + '-' + ri + ' ' + shi + ':' + fen;
  247. // console.log(str);
  248. if(isTime){
  249. return str
  250. }else{
  251. return date
  252. }
  253. }
  254. function isAuth(fun) {
  255. if (!uni.saveImageToPhotosAlbum) {
  256. uni.showModal({
  257. title: '提示',
  258. content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'
  259. });
  260. return;
  261. } //可以通过 wx.getSetting 先查询一下用户是否授权了 "scope.writePhotosAlbum" 这个 scope
  262. // #ifndef H5
  263. uni.getSetting({
  264. success(res) {
  265. if (!res.authSetting['scope.writePhotosAlbum']) {
  266. // 接口调用询问
  267. uni.authorize({
  268. scope: 'scope.writePhotosAlbum',
  269. success() {
  270. // console.log("2-授权《保存图片》权限成功");
  271. fun(true);
  272. },
  273. fail() {
  274. wx.showModal({
  275. title: '提示',
  276. content: '用户拒绝授权访问本地相册导致图片无法保存!如需继续操作,请点击确定前往开启授权',
  277. success: function(res) {
  278. if (res.confirm) {
  279. //点击确定后前往授权设置页面
  280. wx.openSetting();
  281. }
  282. }
  283. });
  284. fun(false);
  285. }
  286. });
  287. } else {
  288. // 拒绝授权
  289. fun(true);
  290. }
  291. },
  292. fail(res) {
  293. fun(false);
  294. }
  295. });
  296. // #endif
  297. }
  298. /**
  299. * 安卓环境
  300. */
  301. function isAndroidSys() {
  302. return uni.getSystemInfoSync().platform == 'android';
  303. }
  304. /**
  305. * ios环境
  306. */
  307. function isIosSys() {
  308. return uni.getSystemInfoSync().platform == 'ios';
  309. }
  310. async function isAuthWritePhotosAlbum(fun) {
  311. console.log('isAuthWritePhotosAlbum>>>>');
  312. var result = await permission.requestAndroidPermission('android.permission.READ_EXTERNAL_STORAGE');
  313. console.log('数据>>>>', result);
  314. if (result == 1) {
  315. // strStatus = "已获得授权"
  316. fun(true);
  317. } else if (result == 0) {
  318. // strStatus = "未获得授权"
  319. fun(false);
  320. } else {
  321. gotoAppPermissionSetting();
  322. fun(false);
  323. // strStatus = "被永久拒绝权限"
  324. }
  325. }
  326. function gotoAppPermissionSetting() {
  327. permission.gotoAppPermissionSetting()
  328. }
  329. /**
  330. * 保存图片到相册
  331. * @param {Object} tempFilePath
  332. */
  333. function saveImageToPhotosAlbum(tempFilePath, suc) {
  334. uni.saveImageToPhotosAlbum({
  335. filePath: tempFilePath,
  336. success(res) {
  337. uni.showToast({
  338. title: '图片保存成功',
  339. icon: 'none'
  340. });
  341. if (suc) {
  342. suc(true);
  343. }
  344. }
  345. // fail(res) {
  346. // uni.showModal({
  347. // title: '提示',
  348. // content: '检测到您没有授权访问相册权限,是否去设置打开?',
  349. // confirmText: '去打开',
  350. // cancelText: '取消',
  351. // success: (res) => {
  352. // if (res.confirm) {
  353. // // #ifdef APP-PLUS
  354. // gotoAppPermissionSetting();
  355. // // #endif
  356. // //#ifndef APP-PLUS
  357. // wx.openSetting();
  358. // // #endif
  359. // } else {
  360. // uni.showToast({
  361. // title: '图片保存失败',
  362. // icon: 'none'
  363. // });
  364. // }
  365. // }
  366. // });
  367. // }
  368. });
  369. }
  370. /**
  371. * 保存图片
  372. * @param {Object} tempFilePath
  373. */
  374. function saveImage(tempFilePath, suc) {
  375. let that = this;
  376. // #ifdef APP-PLUS
  377. if (isIosSys()) {
  378. saveImageToPhotosAlbum(tempFilePath, suc);
  379. } else {
  380. isAuthWritePhotosAlbum(success => {
  381. if (success) {
  382. saveImageToPhotosAlbum(tempFilePath, suc);
  383. }
  384. });
  385. }
  386. // #endif
  387. // #ifndef APP-PLUS
  388. isAuth(success => {
  389. if (success) {
  390. uni.saveImageToPhotosAlbum({
  391. filePath: tempFilePath,
  392. success(res) {
  393. uni.showToast({
  394. title: '图片保存成功',
  395. icon: 'none',
  396. success() {
  397. // suc(true);
  398. }
  399. });
  400. }
  401. });
  402. }
  403. });
  404. // #endif
  405. }
  406. function getAge(birthYearMonthDay) {
  407. birthYearMonthDay = birthYearMonthDay.replace(/-/g, '/')
  408. const birthDate = new Date(birthYearMonthDay);
  409. const momentDate = new Date();
  410. momentDate.setHours(0, 0, 0, 0);
  411. const thisYearBirthDate = new Date(
  412. momentDate.getFullYear(),
  413. birthDate.getMonth(),
  414. birthDate.getDate()
  415. );
  416. const aDate = thisYearBirthDate - birthDate;
  417. const bDate = momentDate - birthDate;
  418. let tempAge = momentDate.getFullYear() - birthDate.getFullYear();
  419. let age = null;
  420. if (bDate < aDate) {
  421. tempAge = tempAge - 1;
  422. age = tempAge < 0 ? 0 : tempAge;
  423. } else {
  424. age = tempAge;
  425. }
  426. return age;
  427. }
  428. // 隐藏手机号中间四位
  429. function styTelText(tel){
  430. if (tel) {
  431. var reg = /^(\d{3})\d{4}(\d{4})$/;
  432. tel = tel.replace(reg, "$1****$2");
  433. console.log('replace',tel)
  434. }
  435. return tel;
  436. }
  437. function monthDayDiff(birthYearMonthDay) {
  438. let flag = [1, 3, 5, 7, 8, 10, 12, 4, 6, 9, 11, 2];
  439. let start = new Date(birthYearMonthDay.replace(/-/g, '/'));
  440. let end = new Date();
  441. let year = end.getFullYear() - start.getFullYear();
  442. let month = end.getMonth() - start.getMonth();
  443. let day = end.getDate() - start.getDate();
  444. if (month < 0) {
  445. year--;
  446. month = end.getMonth() + (12 - start.getMonth());
  447. }
  448. if (day < 0) {
  449. month--;
  450. let index = flag.findIndex((temp) => {
  451. return temp === start.getMonth() + 1
  452. });
  453. let monthLength;
  454. if (index <= 6) {
  455. monthLength = 31;
  456. } else if (index > 6 && index <= 10) {
  457. monthLength = 30;
  458. } else {
  459. monthLength = 28;
  460. }
  461. day = end.getDate() + (monthLength - start.getDate());
  462. }
  463. if(year>0){
  464. return `${year}年`;
  465. }else if(month>0){
  466. return `${month}月`;
  467. }else if(day>0){
  468. return `${day}天`;
  469. }else{
  470. return '0天'
  471. }
  472. }
  473. module.exports = {
  474. formatTime: formatTime,
  475. formatTimes: formatTimes,
  476. formatDayTimes: formatDayTimes,
  477. equalsObj: equalsObj,
  478. isObject: isObject,
  479. isArray: isArray,
  480. transTime: transTime,
  481. throttle: throttle,
  482. getPreMonth: getPreMonth,
  483. isMobile:isMobile,
  484. convertUrlObj:convertUrlObj,
  485. getDateDiff: getDateDiff,
  486. styleHintText:styleHintText,
  487. formatNumbers: formatNumbers,
  488. toDecimal: toDecimal,
  489. captureTime: captureTime,
  490. saveImage: saveImage,
  491. getAge:getAge,
  492. styTelText:styTelText,
  493. monthDayDiff:monthDayDiff
  494. };