code.gitea.io/gitea@v1.22.3/web_src/js/utils/time.js (about)

     1  import dayjs from 'dayjs';
     2  import utc from 'dayjs/plugin/utc.js';
     3  import {getCurrentLocale} from '../utils.js';
     4  
     5  dayjs.extend(utc);
     6  
     7  /**
     8   * Returns an array of millisecond-timestamps of start-of-week days (Sundays)
     9   *
    10   * @param startConfig The start date. Can take any type that `Date` accepts.
    11   * @param endConfig The end date. Can take any type that `Date` accepts.
    12   */
    13  export function startDaysBetween(startDate, endDate) {
    14    const start = dayjs.utc(startDate);
    15    const end = dayjs.utc(endDate);
    16  
    17    let current = start;
    18  
    19    // Ensure the start date is a Sunday
    20    while (current.day() !== 0) {
    21      current = current.add(1, 'day');
    22    }
    23  
    24    const startDays = [];
    25    while (current.isBefore(end)) {
    26      startDays.push(current.valueOf());
    27      current = current.add(1, 'week');
    28    }
    29  
    30    return startDays;
    31  }
    32  
    33  export function firstStartDateAfterDate(inputDate) {
    34    if (!(inputDate instanceof Date)) {
    35      throw new Error('Invalid date');
    36    }
    37    const dayOfWeek = inputDate.getUTCDay();
    38    const daysUntilSunday = 7 - dayOfWeek;
    39    const resultDate = new Date(inputDate.getTime());
    40    resultDate.setUTCDate(resultDate.getUTCDate() + daysUntilSunday);
    41    return resultDate.valueOf();
    42  }
    43  
    44  export function fillEmptyStartDaysWithZeroes(startDays, data) {
    45    const result = {};
    46  
    47    for (const startDay of startDays) {
    48      result[startDay] = data[startDay] || {'week': startDay, 'additions': 0, 'deletions': 0, 'commits': 0};
    49    }
    50  
    51    return Object.values(result);
    52  }
    53  
    54  let dateFormat;
    55  
    56  // format a Date object to document's locale, but with 24h format from user's current locale because this
    57  // option is a personal preference of the user, not something that the document's locale should dictate.
    58  export function formatDatetime(date) {
    59    if (!dateFormat) {
    60      // TODO: replace `hour12` with `Intl.Locale.prototype.getHourCycles` once there is broad browser support
    61      dateFormat = new Intl.DateTimeFormat(getCurrentLocale(), {
    62        day: 'numeric',
    63        month: 'short',
    64        year: 'numeric',
    65        hour: 'numeric',
    66        hour12: !Number.isInteger(Number(new Intl.DateTimeFormat([], {hour: 'numeric'}).format())),
    67        minute: '2-digit',
    68        timeZoneName: 'short',
    69      });
    70    }
    71    return dateFormat.format(date);
    72  }