mirror of
https://github.com/plausible/analytics.git
synced 2024-12-26 02:55:02 +03:00
135 lines
3.1 KiB
JavaScript
135 lines
3.1 KiB
JavaScript
import dayjs from 'dayjs';
|
|
import utc from 'dayjs/plugin/utc';
|
|
|
|
dayjs.extend(utc)
|
|
|
|
// https://stackoverflow.com/a/50130338
|
|
export function formatISO(date) {
|
|
return date.format('YYYY-MM-DD')
|
|
}
|
|
|
|
export function shiftMonths(date, months) {
|
|
return date.add(months, 'months')
|
|
}
|
|
|
|
export function shiftDays(date, days) {
|
|
return date.add(days, 'days')
|
|
}
|
|
|
|
export function formatMonthYYYY(date) {
|
|
return date.format('MMMM YYYY')
|
|
}
|
|
|
|
export function formatYear(date) {
|
|
return `Year of ${date.year()}`;
|
|
}
|
|
|
|
export function formatYearShort(date) {
|
|
return date.getUTCFullYear().toString().substring(2)
|
|
}
|
|
|
|
export function formatDay(date) {
|
|
if (date.year() !== dayjs().year()) {
|
|
return date.format('ddd, DD MMM YYYY')
|
|
} else {
|
|
return date.format('ddd, DD MMM')
|
|
}
|
|
}
|
|
|
|
export function formatDayShort(date, includeYear = false) {
|
|
if (includeYear) {
|
|
return date.format('D MMM YY')
|
|
} else {
|
|
return date.format('D MMM')
|
|
}
|
|
}
|
|
|
|
export function formatDateRange(site, from, to) {
|
|
if (!from || !to) return
|
|
if (typeof from === 'string') from = parseUTCDate(from)
|
|
if (typeof to === 'string') to = parseUTCDate(to)
|
|
|
|
if (from.isSame(to)) {
|
|
return formatDay(from)
|
|
} else if (from.isSame(to, 'year')) {
|
|
const includeYear = !isThisYear(site, from)
|
|
return `${formatDayShort(from, false)} - ${formatDayShort(to, includeYear)}`
|
|
} else {
|
|
return `${formatDayShort(from, true)} - ${formatDayShort(to, true)}`
|
|
}
|
|
}
|
|
|
|
export function parseUTCDate(dateString) {
|
|
return dayjs.utc(dateString)
|
|
}
|
|
|
|
export function parseNaiveDate(dateString) {
|
|
return dayjs(dateString)
|
|
}
|
|
|
|
export function nowForSite(site) {
|
|
return dayjs.utc().utcOffset(site.offset / 60)
|
|
}
|
|
|
|
export function yesterday(site) {
|
|
return shiftDays(nowForSite(site), -1)
|
|
}
|
|
|
|
export function lastMonth(site) {
|
|
return shiftMonths(nowForSite(site), -1)
|
|
}
|
|
|
|
export function isSameDate(date1, date2) {
|
|
return formatISO(date1) === formatISO(date2)
|
|
}
|
|
|
|
export function isSameMonth(date1, date2) {
|
|
return formatMonthYYYY(date1) === formatMonthYYYY(date2)
|
|
}
|
|
|
|
export function isToday(site, date) {
|
|
return isSameDate(date, nowForSite(site))
|
|
}
|
|
|
|
export function isThisMonth(site, date) {
|
|
return formatMonthYYYY(date) === formatMonthYYYY(nowForSite(site))
|
|
}
|
|
|
|
export function isThisYear(site, date) {
|
|
return date.year() === nowForSite(site).year()
|
|
}
|
|
|
|
export function isBefore(date1, date2, period) {
|
|
/* assumes 'day' and 'month' are the only valid periods */
|
|
if (date1.year() !== date2.year()) {
|
|
return date1.year() < date2.year();
|
|
}
|
|
if (period === "year") {
|
|
return false;
|
|
}
|
|
if (date1.month() !== date2.month()) {
|
|
return date1.month() < date2.month();
|
|
}
|
|
if (period === "month") {
|
|
return false;
|
|
}
|
|
return date1.date() < date2.date()
|
|
}
|
|
|
|
export function isAfter(date1, date2, period) {
|
|
/* assumes 'day' and 'month' are the only valid periods */
|
|
if (date1.year() !== date2.year()) {
|
|
return date1.year() > date2.year();
|
|
}
|
|
if (period === "year") {
|
|
return false;
|
|
}
|
|
if (date1.month() !== date2.month()) {
|
|
return date1.month() > date2.month();
|
|
}
|
|
if (period === "month") {
|
|
return false;
|
|
}
|
|
return date1.date() > date2.date()
|
|
}
|