index.js 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. export function getNumberOfWeeks(year){
  2. const firstDayOfYear = new Date(year, 0, 1);
  3. const lastDayOfYear = new Date(year, 11, 31);
  4. const daysInYear = (lastDayOfYear - firstDayOfYear) / (24 * 60 * 60 * 1000) + 1;
  5. const weeksInYear = Math.ceil(daysInYear / 7);
  6. return weeksInYear;
  7. }
  8. export function currentWeek(){
  9. let now = new Date();
  10. let currentYear = now.getFullYear();
  11. let firstDayOfYear = new Date(currentYear, 0, 1);
  12. let diffDays = Math.floor((now - firstDayOfYear) / (24 * 60 * 60 * 1000));
  13. let currentWeek = Math.ceil((diffDays + firstDayOfYear.getDay() + 1) / 7);
  14. return currentWeek
  15. }
  16. export function getDateByWeek(week, year) {
  17. year = year || new Date().getFullYear();
  18. let currentDate = new Date(year, 0, 1); // 当年的1月1日
  19. let numDays = currentDate.getDay(); // 获取当年第一天是周几
  20. if (numDays === 0) numDays = 7; // 如果是周日,则numDays设为7
  21. let firstThursday = new Date(currentDate.getTime() + (4 - numDays) * 86400000); // 当年第一个周四
  22. let firstWeek = Math.ceil((firstThursday.getDate() - 1) / 7); // 第一个周四前的周数
  23. week = week + firstWeek; // 加上第一个周四的周数
  24. if (week === 0) {
  25. year -= 1; // 如果是0周,则获取上一年的最后一周
  26. week = getWeekNumber(new Date(year, 11, 31)); // 上一年12月31日的周数
  27. } else if (week > 52 && getWeekNumber(new Date(year + 1, 0, 3)) === 1) {
  28. year += 1; // 如果超过52周且下一年的1月3日是周一,则获取下一年的第一周
  29. week = 1;
  30. }
  31. currentDate = new Date(year, 0, 1); // 设置为当年的1月1日
  32. currentDate.setDate(currentDate.getDate() + (week - 1) * 7); // 计算当周的日期
  33. return currentDate; // 返回当前周的日期
  34. }
  35. function getWeekNumber(date) {
  36. let currentDate = new Date(date.getTime());
  37. let numDays = currentDate.getDay();
  38. if (numDays === 0) numDays = 7;
  39. currentDate.setDate(currentDate.getDate() + 3 - numDays); // 周一
  40. let firstDayYear = new Date(currentDate.getFullYear(), 0, 1); // 当年的1月1日
  41. let firstWeek = Math.ceil((firstDayYear.getDay() - firstDayYear.getDay() % 7) / 7); // 第一个周一是当年的第几周
  42. let weekNumber = Math.ceil((currentDate.getDay() * 5 - firstDayYear.getDay() + 10) / 7); // 当前周数
  43. return firstWeek + weekNumber;
  44. }
  45. export function parseTime(time, cFormat) {
  46. if (arguments.length === 0 || !time) {
  47. return null
  48. }
  49. const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
  50. let date
  51. if (typeof time === 'object') {
  52. date = time
  53. } else {
  54. if ((typeof time === 'string')) {
  55. if ((/^[0-9]+$/.test(time))) {
  56. // support "1548221490638"
  57. time = parseInt(time)
  58. } else {
  59. // support safari
  60. // https://stackoverflow.com/questions/4310953/invalid-date-in-safari
  61. time = time.replace(new RegExp(/-/gm), '/')
  62. }
  63. }
  64. if ((typeof time === 'number') && (time.toString().length === 10)) {
  65. time = time * 1000
  66. }
  67. date = new Date(time)
  68. }
  69. const formatObj = {
  70. y: date.getFullYear(),
  71. m: date.getMonth() + 1,
  72. d: date.getDate(),
  73. h: date.getHours(),
  74. i: date.getMinutes(),
  75. s: date.getSeconds(),
  76. a: date.getDay()
  77. }
  78. const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
  79. const value = formatObj[key]
  80. // Note: getDay() returns 0 on Sunday
  81. if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] }
  82. return value.toString().padStart(2, '0')
  83. })
  84. return time_str
  85. }