UNPKG

flatpickr

Version:

A lightweight, powerful javascript datetime picker

226 lines (197 loc) 5.56 kB
import { int, pad } from "utils"; import { Locale } from "types/locale"; import { ParsedOptions } from "types/options"; import { monthToStr } from "utils/dates"; export type token = | "D" | "F" | "G" | "H" | "J" | "K" | "M" | "S" | "U" | "W" | "Y" | "Z" | "d" | "h" | "i" | "j" | "l" | "m" | "n" | "s" | "w" | "y"; const do_nothing = () => undefined; export type RevFormatFn = ( date: Date, data: string, locale?: Locale ) => Date | void | undefined; export type RevFormat = Record<string, RevFormatFn>; export const revFormat: RevFormat = { D: do_nothing, F: function(dateObj: Date, monthName: string, locale: Locale) { dateObj.setMonth(locale.months.longhand.indexOf(monthName)); }, G: (dateObj: Date, hour: string) => { dateObj.setHours(parseFloat(hour)); }, H: (dateObj: Date, hour: string) => { dateObj.setHours(parseFloat(hour)); }, J: (dateObj: Date, day: string) => { dateObj.setDate(parseFloat(day)); }, K: (dateObj: Date, amPM: string) => { dateObj.setHours(dateObj.getHours() % 12 + 12 * int(/pm/i.test(amPM))); }, M: function(dateObj: Date, shortMonth: string, locale: Locale) { dateObj.setMonth(locale.months.shorthand.indexOf(shortMonth)); }, S: (dateObj: Date, seconds: string) => { dateObj.setSeconds(parseFloat(seconds)); }, U: (_: Date, unixSeconds: string) => new Date(parseFloat(unixSeconds) * 1000), W: function(dateObj: Date, weekNum: string) { const weekNumber = parseInt(weekNum); return new Date( dateObj.getFullYear(), 0, 2 + (weekNumber - 1) * 7, 0, 0, 0, 0 ); }, Y: (dateObj: Date, year: string) => { dateObj.setFullYear(parseFloat(year)); }, Z: (_: Date, ISODate: string) => new Date(ISODate), d: (dateObj: Date, day: string) => { dateObj.setDate(parseFloat(day)); }, h: (dateObj: Date, hour: string) => { dateObj.setHours(parseFloat(hour)); }, i: (dateObj: Date, minutes: string) => { dateObj.setMinutes(parseFloat(minutes)); }, j: (dateObj: Date, day: string) => { dateObj.setDate(parseFloat(day)); }, l: do_nothing, m: (dateObj: Date, month: string) => { dateObj.setMonth(parseFloat(month) - 1); }, n: (dateObj: Date, month: string) => { dateObj.setMonth(parseFloat(month) - 1); }, s: (dateObj: Date, seconds: string) => { dateObj.setSeconds(parseFloat(seconds)); }, w: do_nothing, y: (dateObj: Date, year: string) => { dateObj.setFullYear(2000 + parseFloat(year)); }, }; export type TokenRegex = { [k in token]: string }; export const tokenRegex: TokenRegex = { D: "(\\w+)", F: "(\\w+)", G: "(\\d\\d|\\d)", H: "(\\d\\d|\\d)", J: "(\\d\\d|\\d)\\w+", K: "(am|AM|Am|aM|pm|PM|Pm|pM)", M: "(\\w+)", S: "(\\d\\d|\\d)", U: "(.+)", W: "(\\d\\d|\\d)", Y: "(\\d{4})", Z: "(.+)", d: "(\\d\\d|\\d)", h: "(\\d\\d|\\d)", i: "(\\d\\d|\\d)", j: "(\\d\\d|\\d)", l: "(\\w+)", m: "(\\d\\d|\\d)", n: "(\\d\\d|\\d)", s: "(\\d\\d|\\d)", w: "(\\d\\d|\\d)", y: "(\\d{2})", }; export type Formats = Record< token, (date: Date, locale: Locale, options: ParsedOptions) => string | number >; export const formats: Formats = { // get the date in UTC Z: (date: Date) => date.toISOString(), // weekday name, short, e.g. Thu D: function(date: Date, locale: Locale, options: ParsedOptions) { return locale.weekdays.shorthand[ formats.w(date, locale, options) as number ]; }, // full month name e.g. January F: function(date: Date, locale: Locale, options: ParsedOptions) { return monthToStr( (formats.n(date, locale, options) as number) - 1, false, locale ); }, // padded hour 1-12 G: function(date: Date, locale: Locale, options: ParsedOptions) { return pad(formats.h(date, locale, options)); }, // hours with leading zero e.g. 03 H: (date: Date) => pad(date.getHours()), // day (1-30) with ordinal suffix e.g. 1st, 2nd J: function(date: Date, locale: Locale) { return locale.ordinal !== undefined ? date.getDate() + locale.ordinal(date.getDate()) : date.getDate(); }, // AM/PM K: (date: Date) => (date.getHours() > 11 ? "PM" : "AM"), // shorthand month e.g. Jan, Sep, Oct, etc M: function(date: Date, locale: Locale) { return monthToStr(date.getMonth(), true, locale); }, // seconds 00-59 S: (date: Date) => pad(date.getSeconds()), // unix timestamp U: (date: Date) => date.getTime() / 1000, W: function(date: Date, _: Locale, options: ParsedOptions) { return options.getWeek(date); }, // full year e.g. 2016 Y: (date: Date) => date.getFullYear(), // day in month, padded (01-30) d: (date: Date) => pad(date.getDate()), // hour from 1-12 (am/pm) h: (date: Date) => (date.getHours() % 12 ? date.getHours() % 12 : 12), // minutes, padded with leading zero e.g. 09 i: (date: Date) => pad(date.getMinutes()), // day in month (1-30) j: (date: Date) => date.getDate(), // weekday name, full, e.g. Thursday l: function(date: Date, locale: Locale) { return locale.weekdays.longhand[date.getDay()]; }, // padded month number (01-12) m: (date: Date) => pad(date.getMonth() + 1), // the month number (1-12) n: (date: Date) => date.getMonth() + 1, // seconds 0-59 s: (date: Date) => date.getSeconds(), // number of the day of the week w: (date: Date) => date.getDay(), // last two digits of year e.g. 16 for 2016 y: (date: Date) => String(date.getFullYear()).substring(2), };