timeFormat.js 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // padStart 的 polyfill,因为某些机型或情况,还无法支持es7的padStart,比如电脑版的微信小程序
  2. // 所以这里做一个兼容polyfill的兼容处理
  3. try {
  4. if (!String.prototype.padStart) {
  5. // 为了方便表示这里 fillString 用了ES6 的默认参数,不影响理解
  6. String.prototype.padStart = function (maxLength, fillString = ' ') {
  7. if (Object.prototype.toString.call(fillString) !== "[object String]") throw new TypeError(
  8. 'fillString must be String')
  9. let str = this
  10. // 返回 String(str) 这里是为了使返回的值是字符串字面量,在控制台中更符合直觉
  11. if (str.length >= maxLength) return String(str)
  12. let fillLength = maxLength - str.length,
  13. times = Math.ceil(fillLength / fillString.length)
  14. while (times >>= 1) {
  15. fillString += fillString
  16. if (times === 1) {
  17. fillString += fillString
  18. }
  19. }
  20. return fillString.slice(0, fillLength) + str;
  21. }
  22. }
  23. } catch (error) {
  24. console.log("timeFormat fillString error", error);
  25. }
  26. // 其他更多是格式化有如下:
  27. // yyyy:mm:dd|yyyy:mm|yyyy年mm月dd日|yyyy年mm月dd日 hh时MM分等,可自定义组合
  28. export function timeFormat(dateTime = null, fmt = 'yyyy-mm-dd hh:MM:ss') {
  29. try {
  30. // 如果为null,则格式化当前时间
  31. if (!dateTime) dateTime = Number(new Date());
  32. // 如果dateTime长度为10或者13,则为秒和毫秒的时间戳,如果超过13位,则为其他的时间格式
  33. if (dateTime.toString().length == 10) dateTime *= 1000;
  34. let date = new Date(dateTime);
  35. let ret;
  36. let opt = {
  37. "y+": date.getFullYear().toString(), // 年
  38. "m+": (date.getMonth() + 1).toString(), // 月
  39. "d+": date.getDate().toString(), // 日
  40. "h+": date.getHours().toString(), // 时
  41. "M+": date.getMinutes().toString(), // 分
  42. "s+": date.getSeconds().toString() // 秒
  43. // 有其他格式化字符需求可以继续添加,必须转化成字符串
  44. };
  45. for (let k in opt) {
  46. ret = new RegExp("(" + k + ")").exec(fmt);
  47. if (ret) {
  48. fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
  49. };
  50. };
  51. return fmt;
  52. } catch (error) {
  53. console.log("timeFormat error", error);
  54. return "unknown error"
  55. }
  56. }
  57. export function timeFromNow(timestamp) {
  58. try {
  59. const now = new Date().getTime();
  60. let diff = timestamp - now;
  61. // 确定是过去还是未来
  62. const suffix = diff > 0 ? "后" : "前";
  63. diff = Math.abs(diff);
  64. // 计算时间差异
  65. const seconds = Math.floor(diff / 1000);
  66. const minutes = Math.floor(seconds / 60);
  67. const hours = Math.floor(minutes / 60);
  68. const days = Math.floor(hours / 24);
  69. const months = Math.floor(days / 30);
  70. const years = Math.floor(days / 365);
  71. // 根据时间差异返回相应的字符串
  72. if (seconds < 60) {
  73. return `${seconds}秒${suffix}`;
  74. } else if (minutes < 60) {
  75. return `${minutes}分钟${suffix}`;
  76. } else if (hours < 24) {
  77. return `${hours}小时${suffix}`;
  78. } else if (days < 30) {
  79. return `${days}天${suffix}`;
  80. } else if (months < 12) {
  81. return `${months}个月${suffix}`;
  82. } else {
  83. return `${years}年${suffix}`;
  84. }
  85. } catch (error) {
  86. console.log("timeFromNow error", error);
  87. }
  88. }