CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/npm-dayjs

2KB immutable date time library alternative to Moment.js with the same modern API

Pending

Quality

Pending

Does it follow best practices?

Impact

Pending

No eval scenarios have been run

SecuritybySnyk

Pending

The risk profile of this skill

Overview
Eval results
Files

plugins.mddocs/

Plugins

Day.js uses a plugin system to keep the core library small while providing extensive functionality through optional plugins. This enables tree-shaking and allows users to include only the features they need.

Capabilities

Plugin System Core

The plugin system allows extending Day.js with additional functionality through a simple registration mechanism.

/**
 * Extend dayjs with plugin functionality
 * @param plugin - Plugin function that extends Day.js
 * @param option - Optional configuration for the plugin
 * @returns dayjs function for chaining
 */
dayjs.extend<T = unknown>(plugin: PluginFunc<T>, option?: T): typeof dayjs;

/**
 * Plugin function interface
 * @param option - Plugin options passed during registration
 * @param dayjsClass - Dayjs constructor class
 * @param dayjsFactory - Main dayjs factory function
 */
interface PluginFunc<T = unknown> {
  (option: T, dayjsClass: typeof Dayjs, dayjsFactory: typeof dayjs): void;
}

Usage Examples:

import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone';
import relativeTime from 'dayjs/plugin/relativeTime';

// Install plugins
dayjs.extend(utc);
dayjs.extend(timezone);
dayjs.extend(relativeTime, {
  thresholds: [
    { l: 's', r: 44, d: 'second' },
    { l: 'm', r: 89 },
    { l: 'mm', r: 44, d: 'minute' }
  ]
});

// Plugins are now available
const utcDate = dayjs.utc();
const timeInTokyo = dayjs().tz('Asia/Tokyo');
const relative = dayjs().fromNow();

Essential Plugins

UTC Plugin

Adds UTC mode support for parsing and displaying dates in UTC timezone.

/**
 * Parse date in UTC mode
 * @param date - Input date to parse
 * @returns Dayjs instance in UTC mode
 */
dayjs.utc(date?: ConfigType): Dayjs;

/**
 * Convert instance to UTC mode
 * @param keepLocalTime - Preserve local time when converting
 * @returns New Dayjs instance in UTC mode
 */
utc(keepLocalTime?: boolean): Dayjs;

/**
 * Convert instance to local timezone
 * @returns New Dayjs instance in local timezone
 */
local(): Dayjs;

/**
 * Check if instance is in UTC mode
 * @returns True if instance is in UTC mode
 */
isUTC(): boolean;

/**
 * Set or get UTC offset in minutes
 * @param input - Offset in minutes or offset string
 * @param keepLocalTime - Preserve local time when setting offset
 * @returns Current offset or new instance with offset
 */
utcOffset(): number;
utcOffset(input: number | string, keepLocalTime?: boolean): Dayjs;

Usage Examples:

import utc from 'dayjs/plugin/utc';
dayjs.extend(utc);

// Parse in UTC
const utcDate = dayjs.utc('2018-04-04T16:00:00.000Z');
const utcNow = dayjs.utc();

// Convert to/from UTC
const localDate = dayjs();
const asUtc = localDate.utc(); // Convert to UTC
const backToLocal = asUtc.local(); // Convert back to local

// UTC offset operations
console.log(dayjs().utcOffset()); // Current offset in minutes
const offsetDate = dayjs().utcOffset(480); // Set to +08:00
const withStringOffset = dayjs().utcOffset('+08:00');

// Check UTC mode
console.log(dayjs.utc().isUTC()); // true
console.log(dayjs().isUTC()); // false

Timezone Plugin

Comprehensive timezone support using IANA timezone database.

/**
 * Parse date in specific timezone
 * @param date - Input date
 * @param timezone - IANA timezone name
 * @returns Dayjs instance in specified timezone
 */
dayjs.tz(date?: ConfigType, timezone?: string): Dayjs;
dayjs.tz(date: ConfigType, format: string, timezone?: string): Dayjs;

/**
 * Convert instance to specific timezone
 * @param timezone - IANA timezone name
 * @param keepLocalTime - Preserve local time when converting
 * @returns New Dayjs instance in specified timezone
 */
tz(timezone?: string, keepLocalTime?: boolean): Dayjs;

/**
 * Get timezone offset name
 * @param type - Format type ('short' or 'long')
 * @returns Timezone offset name
 */
offsetName(type?: 'short' | 'long'): string | undefined;

/**
 * Guess the current timezone
 * @returns IANA timezone name
 */
dayjs.tz.guess(): string;

/**
 * Set default timezone for dayjs.tz()
 * @param timezone - Default IANA timezone name
 */
dayjs.tz.setDefault(timezone?: string): void;

Usage Examples:

import timezone from 'dayjs/plugin/timezone';
import utc from 'dayjs/plugin/utc'; // Required dependency

dayjs.extend(utc);
dayjs.extend(timezone);

// Parse in timezone
const tokyoTime = dayjs.tz('2018-04-04 16:00', 'Asia/Tokyo');
const nyTime = dayjs.tz('2018-04-04 16:00', 'America/New_York');

// Convert between timezones
const utcTime = dayjs.utc();
const inTokyo = utcTime.tz('Asia/Tokyo');
const inLondon = utcTime.tz('Europe/London');

// Timezone information
console.log(dayjs().tz('Asia/Tokyo').offsetName()); // 'JST'
console.log(dayjs().tz('America/New_York').offsetName('long')); // 'Eastern Standard Time'

// Guess current timezone
console.log(dayjs.tz.guess()); // 'America/New_York' (example)

// Set default timezone
dayjs.tz.setDefault('Asia/Tokyo');
const defaultTz = dayjs.tz('2018-04-04 16:00'); // Uses Tokyo timezone

Duration Plugin

Adds support for Duration objects representing time periods.

/**
 * Create a Duration instance
 * @param input - Duration input (number, string, or object)
 * @param unit - Time unit when input is number
 * @returns Duration instance
 */
dayjs.duration(input: DurationInputType, unit?: DurationUnitType): Duration;

/**
 * Check if value is a Duration instance
 * @param d - Value to check
 * @returns True if value is Duration
 */
dayjs.isDuration(d: any): d is Duration;

/**
 * Duration class for representing time periods
 */
interface Duration {
  /**
   * Add duration to Dayjs instance
   */
  add(input: DurationInputType, unit?: DurationUnitType): Duration;
  add(duration: Duration): Duration;
  
  /**
   * Subtract duration from Dayjs instance
   */
  subtract(input: DurationInputType, unit?: DurationUnitType): Duration;
  subtract(duration: Duration): Duration;
  
  /**
   * Get duration component value
   */
  milliseconds(): number;
  seconds(): number;
  minutes(): number;
  hours(): number;
  days(): number;
  weeks(): number;
  months(): number;
  years(): number;
  
  /**
   * Get duration as total value in unit
   */
  asMilliseconds(): number;
  asSeconds(): number;
  asMinutes(): number;
  asHours(): number;
  asDays(): number;
  asWeeks(): number;
  asMonths(): number;
  asYears(): number;
  
  /**
   * Get duration as value in specific unit
   */
  as(unit: DurationUnitType): number;
  get(unit: DurationUnitType): number;
  
  /**
   * Format duration as string
   */
  format(template?: string): string;
  toISOString(): string;
  toJSON(): string;
  
  /**
   * Humanize duration
   */
  humanize(withSuffix?: boolean): string;
  
  /**
   * Clone duration
   */
  clone(): Duration;
  
  /**
   * Set locale for duration
   */
  locale(locale: string): Duration;
}

type DurationUnitType = Exclude<OpUnitType, "date" | "dates">;
type DurationInputType = string | number | DurationUnitsObject;
interface DurationUnitsObject {
  years?: number;
  months?: number;
  weeks?: number;
  days?: number;
  hours?: number;
  minutes?: number;
  seconds?: number;
  milliseconds?: number;
}

Usage Examples:

import duration from 'dayjs/plugin/duration';
dayjs.extend(duration);

// Create durations
const dur1 = dayjs.duration(100); // 100 milliseconds
const dur2 = dayjs.duration(2, 'minutes');
const dur3 = dayjs.duration({ hours: 2, minutes: 30 });
const dur4 = dayjs.duration('PT2H30M'); // ISO 8601

// Duration arithmetic
const sum = dur2.add(30, 'seconds');
const diff = dur3.subtract(1, 'hour');

// Get components
console.log(dur3.hours()); // 2
console.log(dur3.minutes()); // 30

// Get as total values
console.log(dur3.asMinutes()); // 150
console.log(dur3.asHours()); // 2.5

// Format durations
console.log(dur3.format('H:mm')); // '2:30'
console.log(dur3.toISOString()); // 'PT2H30M'

// Humanize
console.log(dur2.humanize()); // '2 minutes'
console.log(dur2.humanize(true)); // 'in 2 minutes'

Relative Time Plugin

Adds methods for displaying relative time (e.g., "2 hours ago", "in 3 days").

/**
 * Display time from now
 * @param withoutSuffix - Omit 'ago' or 'in' suffix
 * @returns Relative time string
 */
fromNow(withoutSuffix?: boolean): string;

/**
 * Display time from another date
 * @param compared - Date to compare from
 * @param withoutSuffix - Omit 'ago' or 'in' suffix
 * @returns Relative time string
 */
from(compared: ConfigType, withoutSuffix?: boolean): string;

/**
 * Display time to now
 * @param withoutSuffix - Omit 'ago' or 'in' suffix
 * @returns Relative time string
 */
toNow(withoutSuffix?: boolean): string;

/**
 * Display time to another date
 * @param compared - Date to compare to
 * @param withoutSuffix - Omit 'ago' or 'in' suffix
 * @returns Relative time string
 */
to(compared: ConfigType, withoutSuffix?: boolean): string;

interface RelativeTimeOptions {
  rounding?: (num: number) => number;
  thresholds?: RelativeTimeThreshold[];
}

interface RelativeTimeThreshold {
  l: string; // threshold key
  r?: number; // range
  d?: string; // unit
}

Usage Examples:

import relativeTime from 'dayjs/plugin/relativeTime';
dayjs.extend(relativeTime);

const now = dayjs();
const pastDate = dayjs().subtract(2, 'hour');
const futureDate = dayjs().add(3, 'day');

// From now
console.log(pastDate.fromNow()); // '2 hours ago'
console.log(futureDate.fromNow()); // 'in 3 days'
console.log(pastDate.fromNow(true)); // '2 hours' (without suffix)

// To now
console.log(pastDate.toNow()); // 'in 2 hours'
console.log(futureDate.toNow()); // '3 days ago'

// From/to specific dates
const date1 = dayjs('2018-01-01');
const date2 = dayjs('2018-01-03');
console.log(date1.from(date2)); // '2 days ago'
console.log(date1.to(date2)); // 'in 2 days'

Formatting Plugins

Advanced Format Plugin

Adds additional format tokens for more formatting options.

// Additional format tokens available after installing advancedFormat plugin:
// Q - Quarter (1-4)
// Do - Day of month with ordinal (1st, 2nd, 3rd, etc.)
// k - Hour (1-24)
// kk - Hour, zero-padded (01-24)
// X - Unix timestamp (seconds)
// x - Unix timestamp (milliseconds)

Usage Examples:

import advancedFormat from 'dayjs/plugin/advancedFormat';
dayjs.extend(advancedFormat);

const date = dayjs('2018-04-04T16:00:00.000Z');

console.log(date.format('Q')); // 2 (quarter)
console.log(date.format('Do')); // 4th
console.log(date.format('k')); // 16 (hour 1-24)
console.log(date.format('kk')); // 16 (hour padded)
console.log(date.format('X')); // 1522857600 (unix seconds)
console.log(date.format('x')); // 1522857600000 (unix milliseconds)

// Combined usage
console.log(date.format('Qo [quarter], Do [day]')); // '2nd quarter, 4th day'

Localized Format Plugin

Adds localized formatting shortcuts that adapt to the current locale.

// Localized format tokens:
// L - Short date (MM/DD/YYYY or DD/MM/YYYY based on locale)
// LL - Medium date (MMMM D, YYYY)
// LLL - Long date with time (MMMM D, YYYY h:mm A)
// LLLL - Full date with day (dddd, MMMM D, YYYY h:mm A)
// LT - Time (h:mm A)
// LTS - Time with seconds (h:mm:ss A)

Usage Examples:

import localizedFormat from 'dayjs/plugin/localizedFormat';
dayjs.extend(localizedFormat);

const date = dayjs('2018-04-04T16:00:00.000Z');

// English locale
console.log(date.format('L')); // 04/04/2018
console.log(date.format('LL')); // April 4, 2018
console.log(date.format('LLL')); // April 4, 2018 4:00 PM
console.log(date.format('LLLL')); // Wednesday, April 4, 2018 4:00 PM
console.log(date.format('LT')); // 4:00 PM
console.log(date.format('LTS')); // 4:00:00 PM

// Different locale
const frenchDate = date.locale('fr');
console.log(frenchDate.format('LL')); // 4 avril 2018
console.log(frenchDate.format('LLLL')); // mercredi 4 avril 2018 16:00

Parsing Plugins

Custom Parse Format Plugin

Enables parsing dates with custom format strings.

/**
 * Parse date with custom format
 * @param dateString - Date string to parse
 * @param formatString - Format pattern
 * @param strict - Enable strict parsing mode
 * @returns Dayjs instance
 */
dayjs(dateString: string, formatString: string, strict?: boolean): Dayjs;

Usage Examples:

import customParseFormat from 'dayjs/plugin/customParseFormat';
dayjs.extend(customParseFormat);

// Parse with custom formats
const date1 = dayjs('12-25-1995', 'MM-DD-YYYY');
const date2 = dayjs('1995/25/12', 'YYYY/DD/MM');
const date3 = dayjs('1995-12-25 14:30', 'YYYY-MM-DD HH:mm');

// Strict parsing
const strict = dayjs('12-25-1995', 'MM-DD-YYYY', true);
const invalid = dayjs('invalid', 'MM-DD-YYYY', true);
console.log(invalid.isValid()); // false

// Array of formats
const flexible = dayjs('2018-05', ['YYYY', 'YYYY-MM', 'YYYY-MM-DD']);

Query Plugins

Additional query methods for date comparison and validation.

/**
 * Check if date is between two other dates
 * @param a - Start date
 * @param b - End date  
 * @param unit - Comparison unit
 * @param inclusivity - Include endpoints ('[]', '()', '[)', '(]')
 * @returns True if date is between the range
 */
isBetween(a: ConfigType, b: ConfigType, unit?: OpUnitType, inclusivity?: string): boolean;

/**
 * Check if date is same or after another date
 * @param date - Date to compare
 * @param unit - Comparison unit
 * @returns True if same or after
 */
isSameOrAfter(date: ConfigType, unit?: OpUnitType): boolean;

/**
 * Check if date is same or before another date
 * @param date - Date to compare
 * @param unit - Comparison unit
 * @returns True if same or before
 */
isSameOrBefore(date: ConfigType, unit?: OpUnitType): boolean;

/**
 * Check if date is today
 * @returns True if date is today
 */
isToday(): boolean;

/**
 * Check if date is tomorrow
 * @returns True if date is tomorrow
 */
isTomorrow(): boolean;

/**
 * Check if date is yesterday
 * @returns True if date is yesterday
 */
isYesterday(): boolean;

/**
 * Check if year is a leap year
 * @returns True if leap year
 */
isLeapYear(): boolean;

Usage Examples:

import isBetween from 'dayjs/plugin/isBetween';
import isSameOrAfter from 'dayjs/plugin/isSameOrAfter';
import isToday from 'dayjs/plugin/isToday';
import isLeapYear from 'dayjs/plugin/isLeapYear';

dayjs.extend(isBetween);
dayjs.extend(isSameOrAfter);
dayjs.extend(isToday);
dayjs.extend(isLeapYear);

const date = dayjs('2018-04-04');
const start = dayjs('2018-01-01');
const end = dayjs('2018-12-31');

// Between checks
console.log(date.isBetween(start, end)); // true
console.log(date.isBetween(start, end, 'day', '[]')); // inclusive
console.log(date.isBetween(start, end, 'day', '()')); // exclusive

// Same or comparisons
console.log(dayjs().isSameOrAfter(date)); // likely true
console.log(date.isSameOrBefore(dayjs())); // likely true

// Day checks
console.log(dayjs().isToday()); // true
console.log(dayjs().add(1, 'day').isTomorrow()); // true
console.log(dayjs().subtract(1, 'day').isYesterday()); // true

// Leap year
console.log(dayjs('2020-01-01').isLeapYear()); // true
console.log(dayjs('2021-01-01').isLeapYear()); // false

Plugin Installation Pattern

All plugins follow the same installation pattern:

  1. Import the plugin function
  2. Register it with dayjs.extend()
  3. Use the new functionality
// Generic plugin installation pattern
import dayjs from 'dayjs';
import pluginName from 'dayjs/plugin/pluginName';

dayjs.extend(pluginName, optionalConfig);

// Plugin functionality is now available

docs

core-api.md

index.md

localization.md

plugins.md

tile.json