fix(#223): [Bhargavi|Pooja] add filipino locale to date-fns using patch-package

This commit is contained in:
PuBHARGAVI
2023-04-19 11:32:14 +05:30
parent ab7dfdde60
commit 54cee2bd56
18 changed files with 1087 additions and 1420 deletions

View File

@@ -2,7 +2,7 @@ import React from 'react';
import { formatDistanceToNow } from 'date-fns';
import { useTranslation } from 'react-i18next';
import * as DateFnsLocale from '../lib/date-fns/locale';
import * as DateFnsLocale from 'date-fns/locale';
import { ActivityLog } from '../machines/activityLog';
import { TextItem } from './ui/TextItem';

View File

@@ -1,6 +1,6 @@
import { formatDistanceToNow } from 'date-fns';
import React from 'react';
import * as DateFnsLocale from '../lib/date-fns/locale';
import * as DateFnsLocale from 'date-fns/locale';
import { useTranslation } from 'react-i18next';
import { Image, ImageBackground, View } from 'react-native';
import { Icon } from 'react-native-elements';

View File

@@ -1,23 +0,0 @@
import type { FormatLongFn, FormatLongWidth } from '../../types';
export interface BuildFormatLongFnArgs<
DefaultMatchWidth extends FormatLongWidth
> {
formats: Partial<{ [format in FormatLongWidth]: string }> & {
[format in DefaultMatchWidth]: string;
};
defaultWidth: DefaultMatchWidth;
}
export default function buildFormatLongFn<
DefaultMatchWidth extends FormatLongWidth
>(args: BuildFormatLongFnArgs<DefaultMatchWidth>): FormatLongFn {
return (options = {}) => {
// TODO: Remove String()
const width = options.width
? (String(options.width) as FormatLongWidth)
: args.defaultWidth;
const format = args.formats[width] || args.formats[args.defaultWidth];
return format;
};
}

View File

@@ -1,120 +0,0 @@
import type { Era, Quarter, Month, Day } from '../../../types';
import type {
LocaleDayPeriod,
LocalePatternWidth,
LocaleUnit,
LocalizeFn,
LocalizeUnitIndex,
} from '../../types';
type LocalizeEraValues = readonly [string, string];
type LocalizeQuarterValues = readonly [string, string, string, string];
type LocalizeDayValues = readonly [
string,
string,
string,
string,
string,
string,
string
];
type LocalizeMonthValues = readonly [
string,
string,
string,
string,
string,
string,
string,
string,
string,
string,
string,
string
];
export type LocalizeUnitValuesIndex<Values extends LocalizeUnitValues<any>> =
Values extends Record<LocaleDayPeriod, string>
? string
: Values extends LocalizeEraValues
? Era
: Values extends LocalizeQuarterValues
? Quarter
: Values extends LocalizeDayValues
? Day
: Values extends LocalizeMonthValues
? Month
: never;
export type LocalizeUnitValues<Unit extends LocaleUnit> =
Unit extends LocaleDayPeriod
? Record<LocaleDayPeriod, string>
: Unit extends Era
? LocalizeEraValues
: Unit extends Quarter
? LocalizeQuarterValues
: Unit extends Day
? LocalizeDayValues
: Unit extends Month
? LocalizeMonthValues
: never;
export type LocalizePeriodValuesMap<Unit extends LocaleUnit> = {
[pattern in LocalePatternWidth]?: LocalizeUnitValues<Unit>;
};
export type BuildLocalizeFnArgCallback<Result extends LocaleUnit | number> = (
value: Result
) => LocalizeUnitIndex<Result>;
export type BuildLocalizeFnArgs<
Result extends LocaleUnit,
ArgCallback extends BuildLocalizeFnArgCallback<Result> | undefined
> = {
values: LocalizePeriodValuesMap<Result>;
defaultWidth: LocalePatternWidth;
formattingValues?: LocalizePeriodValuesMap<Result>;
defaultFormattingWidth?: LocalePatternWidth;
} & (ArgCallback extends undefined
? { argumentCallback?: undefined }
: { argumentCallback: BuildLocalizeFnArgCallback<Result> });
export default function buildLocalizeFn<
Result extends LocaleUnit,
ArgCallback extends BuildLocalizeFnArgCallback<Result> | undefined
>(
args: BuildLocalizeFnArgs<Result, ArgCallback>
): LocalizeFn<Result, ArgCallback> {
return (dirtyIndex, dirtyOptions) => {
const options = dirtyOptions || {};
const context = options.context ? String(options.context) : 'standalone';
let valuesArray: LocalizeUnitValues<Result>;
if (context === 'formatting' && args.formattingValues) {
const defaultWidth = args.defaultFormattingWidth || args.defaultWidth;
const width = (
options.width ? String(options.width) : defaultWidth
) as LocalePatternWidth;
valuesArray = (args.formattingValues[width] ||
args.formattingValues[defaultWidth]) as LocalizeUnitValues<Result>;
} else {
const defaultWidth = args.defaultWidth;
const width = (
options.width ? String(options.width) : args.defaultWidth
) as LocalePatternWidth;
valuesArray = (args.values[width] ||
args.values[defaultWidth]) as LocalizeUnitValues<Result>;
}
const index = (
args.argumentCallback
? args.argumentCallback(dirtyIndex as Result)
: (dirtyIndex as LocalizeUnitIndex<Result> as unknown)
) as LocalizeUnitValuesIndex<typeof valuesArray>;
// @ts-ignore: For some reason TypeScript just don't want to match it, no matter how hard we try. I challenge you to try to remove it!
return valuesArray[index];
};
}

View File

@@ -1,72 +0,0 @@
import type {
BuildMatchFnArgs,
LocaleDayPeriod,
LocaleUnit,
LocalePatternWidth,
MatchFn,
} from '../../types';
export default function buildMatchFn<
Result extends LocaleUnit,
DefaultMatchWidth extends LocalePatternWidth,
DefaultParseWidth extends LocalePatternWidth
>(
args: BuildMatchFnArgs<Result, DefaultMatchWidth, DefaultParseWidth>
): MatchFn<Result> {
return (string, options = {}) => {
const width = options.width;
const matchPattern =
(width && args.matchPatterns[width]) ||
args.matchPatterns[args.defaultMatchWidth];
const matchResult = string.match(matchPattern);
if (!matchResult) {
return null;
}
const matchedString = matchResult[0];
const parsePatterns =
(width && args.parsePatterns[width]) ||
args.parsePatterns[args.defaultParseWidth];
const key = (
Array.isArray(parsePatterns)
? findIndex(parsePatterns, (pattern) => pattern.test(matchedString))
: findKey(parsePatterns, (pattern: any) => pattern.test(matchedString))
) as Result extends LocaleDayPeriod ? string : number;
let value: Result;
value = (args.valueCallback ? args.valueCallback(key) : key) as Result;
value = options.valueCallback ? options.valueCallback(value) : value;
const rest = string.slice(matchedString.length);
return { value, rest };
};
}
function findKey<Value, Obj extends { [key in string | number]: Value }>(
object: Obj,
predicate: (value: Value) => boolean
): keyof Obj | undefined {
for (const key in object) {
if (object.hasOwnProperty(key) && predicate(object[key])) {
return key;
}
}
return undefined;
}
function findIndex<Item>(
array: Item[],
predicate: (item: Item) => boolean
): number | undefined {
for (let key = 0; key < array.length; key++) {
if (predicate(array[key])) {
return key;
}
}
return undefined;
}

View File

@@ -1,28 +0,0 @@
import type { MatchFn, MatchValueCallback } from '../../types';
export interface BuildMatchPatternFnArgs<Result> {
matchPattern: RegExp;
parsePattern: RegExp;
valueCallback?: MatchValueCallback<string, Result>;
}
export default function buildMatchPatternFn<Result>(
args: BuildMatchPatternFnArgs<Result>
): MatchFn<Result> {
return (string, options = {}) => {
const matchResult = string.match(args.matchPattern);
if (!matchResult) return null;
const matchedString = matchResult[0];
const parseResult = string.match(args.parsePattern);
if (!parseResult) return null;
let value = (
args.valueCallback ? args.valueCallback(parseResult[0]) : parseResult[0]
) as Result;
value = options.valueCallback ? options.valueCallback(value) : value;
const rest = string.slice(matchedString.length);
return { value, rest };
};
}

View File

@@ -1,112 +0,0 @@
import type { FormatDistanceFn, FormatDistanceLocale } from '../../../types';
type FormatDistanceTokenValue =
| string
| {
one: string;
other: string;
};
const formatDistanceLocale: FormatDistanceLocale<FormatDistanceTokenValue> = {
lessThanXSeconds: {
one: 'wala pang isang segundo',
other: 'wala pang {{count}} na segundo',
},
xSeconds: {
one: 'isang segundo',
other: '{{count}} segundo',
},
halfAMinute: 'kalahating minuto',
lessThanXMinutes: {
one: 'wala pang isang minuto',
other: 'wala pang {{count}} na minuto',
},
xMinutes: {
one: 'isang minuto',
other: '{{count}} minuto',
},
aboutXHours: {
one: 'mga isang oras',
other: 'mga {{count}} na oras',
},
xHours: {
one: 'isang oras',
other: '{{count}} na oras',
},
xDays: {
one: 'isang araw',
other: '{{count}} na araw',
},
aboutXWeeks: {
one: 'mga isang linggo',
other: 'mga {{count}} na linggo',
},
xWeeks: {
one: 'isang linggo',
other: '{{count}} na linggo',
},
aboutXMonths: {
one: 'mga isang buwan',
other: 'mga {{count}} na buwan',
},
xMonths: {
one: 'isang buwan',
other: '{{count}} na buwan',
},
aboutXYears: {
one: 'mga isang taon',
other: 'mga {{count}} na taon',
},
xYears: {
one: 'isang taon',
other: '{{count}} na taon',
},
overXYears: {
one: 'mahigit isang taon',
other: 'mahigit {{count}} na taon',
},
almostXYears: {
one: 'halos isang taon',
other: 'halos {{count}} na taon',
},
};
const formatDistance: FormatDistanceFn = (token, count, options) => {
let result;
const tokenValue = formatDistanceLocale[token];
if (typeof tokenValue === 'string') {
result = tokenValue;
} else if (count === 1) {
result = tokenValue.one;
} else {
result = tokenValue.other.replace('{{count}}', count.toString());
}
if (options?.addSuffix) {
if (options.comparison && options.comparison > 0) {
return 'sa ' + result;
} else {
return result + ' nakaraan';
}
}
return result;
};
export default formatDistance;

View File

@@ -1,42 +0,0 @@
import buildFormatLongFn from '../../../_lib/buildFormatLongFn/index';
import type { FormatLong } from '../../../types';
const dateFormats = {
full: 'EEEE, MMMM do, y',
long: 'MMMM do, y',
medium: 'MMM d, y',
short: 'MM/dd/yyyy',
};
const timeFormats = {
full: 'h:mm:ss a zzzz',
long: 'h:mm:ss a z',
medium: 'h:mm:ss a',
short: 'h:mm a',
};
const dateTimeFormats = {
full: "{{date}} 'at' {{time}}",
long: "{{date}} 'at' {{time}}",
medium: '{{date}}, {{time}}',
short: '{{date}}, {{time}}',
};
const formatLong: FormatLong = {
date: buildFormatLongFn({
formats: dateFormats,
defaultWidth: 'full',
}),
time: buildFormatLongFn({
formats: timeFormats,
defaultWidth: 'full',
}),
dateTime: buildFormatLongFn({
formats: dateTimeFormats,
defaultWidth: 'full',
}),
};
export default formatLong;

View File

@@ -1,15 +0,0 @@
import type { FormatRelativeFn } from '../../../types';
const formatRelativeLocale = {
lastWeek: "'last' eeee 'at' p",
yesterday: "'yesterday at' p",
today: "'today at' p",
tomorrow: "'tomorrow at' p",
nextWeek: "eeee 'at' p",
other: 'P',
};
const formatRelative: FormatRelativeFn = (token, _date, _baseDate, _options) =>
formatRelativeLocale[token];
export default formatRelative;

View File

@@ -1,199 +0,0 @@
import type { Quarter } from '../../../../types';
import type { Localize, LocalizeFn } from '../../../types';
import buildLocalizeFn from '../../../_lib/buildLocalizeFn/index';
const eraValues = {
narrow: ['B', 'A'] as const,
abbreviated: ['BC', 'AD'] as const,
wide: ['Before Christ', 'Anno Domini'] as const,
};
const quarterValues = {
narrow: ['1', '2', '3', '4'] as const,
abbreviated: ['Q1', 'Q2', 'Q3', 'Q4'] as const,
wide: [
'Unang sangkapat',
'Ikalawang sangkapat',
'Ikatlong sangkapat',
'Ikaapat sangkapat',
] as const,
};
// Note: in English, the names of days of the week and months are capitalized.
// If you are making a new locale based on this one, check if the same is true for the language you're working on.
// Generally, formatted dates should look like they are in the middle of a sentence,
// e.g. in Spanish language the weekdays and months should be in the lowercase.
const monthValues = {
narrow: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'] as const,
abbreviated: [
'Enero',
'Peb',
'Marso',
'Abr',
'Mayo',
'Hun',
'Hul',
'Agosto',
'Set',
'Okt',
'Nob',
'Dis',
] as const,
wide: [
'Enero',
'Pebrero',
'Marso',
'Abril',
'Mayo',
'Hunyo',
'Hulyo',
'Agosto',
'Setyembre',
'Oktubre',
'Nobyembre',
'Disyembre',
] as const,
};
const dayValues = {
narrow: ['L', 'L', 'M', 'M', 'H', 'B', 'S'] as const,
short: ['Li', 'Lu', 'Ma', 'Mi', 'Hu', 'Bi', 'Sa'] as const,
abbreviated: ['Lin', 'Lun', 'Mar', 'Miy', 'Huw', 'Biy', 'Sab'] as const,
wide: [
'Linggo',
'Lunes',
'Martes',
'Miyerkules',
'Huwebes',
'Biyernes',
'Sabado',
] as const,
};
const dayPeriodValues = {
narrow: {
am: 'a',
pm: 'p',
midnight: 'mi',
noon: 'n',
morning: 'umaga',
afternoon: 'hapon',
evening: 'gabi',
night: 'gabi',
},
abbreviated: {
am: 'AM',
pm: 'PM',
midnight: 'hatinggabi',
noon: 'tanghali',
morning: 'umaga',
afternoon: 'hapon',
evening: 'gabi',
night: 'gabi',
},
wide: {
am: 'a.m.',
pm: 'p.m.',
midnight: 'hatinggabi',
noon: 'tanghali',
morning: 'umaga',
afternoon: 'hapon',
evening: 'gabi',
night: 'gabi',
},
};
const formattingDayPeriodValues = {
narrow: {
am: 'a',
pm: 'p',
midnight: 'mi',
noon: 'n',
morning: 'sa umaga',
afternoon: 'sa hapon',
evening: 'sa gabi',
night: 'sa gabi',
},
abbreviated: {
am: 'AM',
pm: 'PM',
midnight: 'midnight',
noon: 'noon',
morning: 'sa umaga',
afternoon: 'sa hapon',
evening: 'sa gabi',
night: 'sa gabi',
},
wide: {
am: 'a.m.',
pm: 'p.m.',
midnight: 'midnight',
noon: 'noon',
morning: 'sa umaga',
afternoon: 'sa hapon',
evening: 'sa gabi',
night: 'sa gabi',
},
};
const ordinalNumber: LocalizeFn<number, undefined> = (
dirtyNumber,
_options
) => {
const number = Number(dirtyNumber);
// If ordinal numbers depend on context, for example,
// if they are different for different grammatical genders,
// use `options.unit`.
//
// `unit` can be 'year', 'quarter', 'month', 'week', 'date', 'dayOfYear',
// 'day', 'hour', 'minute', 'second'.
// const rem100 = number % 100
// if (rem100 > 20 || rem100 < 10) {
// switch (rem100 % 10) {
// case 1:
// return number + 'st'
// case 2:
// return number + 'nd'
// case 3:
// return number + 'rd'
// }
// }
return 'ika-' + number;
};
const localize: Localize = {
ordinalNumber,
era: buildLocalizeFn({
values: eraValues,
defaultWidth: 'wide',
}),
quarter: buildLocalizeFn({
values: quarterValues,
defaultWidth: 'wide',
argumentCallback: (quarter) => (quarter - 1) as Quarter,
}),
month: buildLocalizeFn({
values: monthValues,
defaultWidth: 'wide',
}),
day: buildLocalizeFn({
values: dayValues,
defaultWidth: 'wide',
}),
dayPeriod: buildLocalizeFn({
values: dayPeriodValues,
defaultWidth: 'wide',
formattingValues: formattingDayPeriodValues,
defaultFormattingWidth: 'wide',
}),
};
export default localize;

View File

@@ -1,135 +0,0 @@
import type { Quarter } from '../../../../types';
import type { Match } from '../../../types';
import buildMatchFn from '../../../_lib/buildMatchFn/index';
import buildMatchPatternFn from '../../../_lib/buildMatchPatternFn/index';
const matchOrdinalNumberPattern = /^(\d+)(th|st|nd|rd)?/i;
const parseOrdinalNumberPattern = /\d+/i;
const matchEraPatterns = {
narrow: /^(b|a)/i,
abbreviated: /^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,
wide: /^(before christ|before common era|anno domini|common era)/i,
};
const parseEraPatterns = {
any: [/^b/i, /^(a|c)/i] as const,
};
const matchQuarterPatterns = {
narrow: /^[1234]/i,
abbreviated: /^q[1234]/i,
wide: /^[1234](th|st|nd|rd)? quarter/i,
};
const parseQuarterPatterns = {
any: [/1/i, /2/i, /3/i, /4/i] as const,
};
const matchMonthPatterns = {
narrow: /^[jfmasond]/i,
abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,
wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i,
};
const parseMonthPatterns = {
narrow: [
/^j/i,
/^f/i,
/^m/i,
/^a/i,
/^m/i,
/^j/i,
/^j/i,
/^a/i,
/^s/i,
/^o/i,
/^n/i,
/^d/i,
] as const,
any: [
/^ja/i,
/^f/i,
/^mar/i,
/^ap/i,
/^may/i,
/^jun/i,
/^jul/i,
/^au/i,
/^s/i,
/^o/i,
/^n/i,
/^d/i,
] as const,
};
const matchDayPatterns = {
narrow: /^[smtwf]/i,
short: /^(su|mo|tu|we|th|fr|sa)/i,
abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,
wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i,
};
const parseDayPatterns = {
narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i] as const,
any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i] as const,
};
const matchDayPeriodPatterns = {
narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,
any: /^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i,
};
const parseDayPeriodPatterns = {
any: {
am: /^a/i,
pm: /^p/i,
midnight: /^mi/i,
noon: /^no/i,
morning: /morning/i,
afternoon: /afternoon/i,
evening: /evening/i,
night: /night/i,
},
};
const match: Match = {
ordinalNumber: buildMatchPatternFn({
matchPattern: matchOrdinalNumberPattern,
parsePattern: parseOrdinalNumberPattern,
valueCallback: (value) => parseInt(value, 10),
}),
era: buildMatchFn({
matchPatterns: matchEraPatterns,
defaultMatchWidth: 'wide',
parsePatterns: parseEraPatterns,
defaultParseWidth: 'any',
}),
quarter: buildMatchFn({
matchPatterns: matchQuarterPatterns,
defaultMatchWidth: 'wide',
parsePatterns: parseQuarterPatterns,
defaultParseWidth: 'any',
valueCallback: (index) => (index + 1) as Quarter,
}),
month: buildMatchFn({
matchPatterns: matchMonthPatterns,
defaultMatchWidth: 'wide',
parsePatterns: parseMonthPatterns,
defaultParseWidth: 'any',
}),
day: buildMatchFn({
matchPatterns: matchDayPatterns,
defaultMatchWidth: 'wide',
parsePatterns: parseDayPatterns,
defaultParseWidth: 'any',
}),
dayPeriod: buildMatchFn({
matchPatterns: matchDayPeriodPatterns,
defaultMatchWidth: 'any',
parsePatterns: parseDayPeriodPatterns,
defaultParseWidth: 'any',
}),
};
export default match;

View File

@@ -1,4 +0,0 @@
// This file is generated automatically by `scripts/build/typings.js`. Please, don't change it.
import { fil } from 'date-fns/locale';
export default fil;

View File

@@ -1,35 +0,0 @@
// @flow
// This file is generated automatically by `scripts/build/typings.js`. Please, don't change it.
export type Locale = {
code?: string,
formatDistance?: (...args: Array<any>) => any,
formatRelative?: (...args: Array<any>) => any,
localize?: {
ordinalNumber: (...args: Array<any>) => any,
era: (...args: Array<any>) => any,
quarter: (...args: Array<any>) => any,
month: (...args: Array<any>) => any,
day: (...args: Array<any>) => any,
dayPeriod: (...args: Array<any>) => any,
},
formatLong?: {
date: (...args: Array<any>) => any,
time: (...args: Array<any>) => any,
dateTime: (...args: Array<any>) => any,
},
match?: {
ordinalNumber: (...args: Array<any>) => any,
era: (...args: Array<any>) => any,
quarter: (...args: Array<any>) => any,
month: (...args: Array<any>) => any,
day: (...args: Array<any>) => any,
dayPeriod: (...args: Array<any>) => any,
},
options?: {
weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6,
firstWeekContainsDate?: 1 | 2 | 3 | 4 | 5 | 6 | 7,
},
}
declare module.exports: Locale

View File

@@ -1,29 +0,0 @@
import formatDistance from './_lib/formatDistance/index';
import formatLong from './_lib/formatLong/index';
import formatRelative from './_lib/formatRelative/index';
import localize from './_lib/localize/index';
import match from './_lib/match/index';
import type { Locale } from '../types';
/**
* @type {Locale}
* @category Locales
* @summary Filipino locale (Philippines)
* @language Filipino
* @iso-639-2 fil
* @author Paolo Miguel de Leon [@pmigueld]{@link https://github.com/pmigueld}
*/
const locale: Locale = {
code: 'fil',
formatDistance: formatDistance,
formatLong: formatLong,
formatRelative: formatRelative,
localize: localize,
match: match,
options: {
weekStartsOn: 0 /* Sunday */,
firstWeekContainsDate: 1,
},
};
export default locale;

View File

@@ -1,330 +0,0 @@
# English (en-US) locale
## `format` and `parse`
| Title | Token string | Date | `format` result | `parse` result |
| ------------------------------- | ------------ | ------------------------ | ------------------------------------------------------- | ------------------------ |
| Calendar year | yo | 1987-02-11T12:13:14.015Z | 1987th | 1987-01-01T00:00:00.000Z |
| | | 0005-01-01T12:13:14.015Z | 5th | 0005-01-01T00:00:00.000Z |
| Local week-numbering year | Yo | 1987-02-11T12:13:14.015Z | 1987th | 1986-12-28T00:00:00.000Z |
| | | 0005-01-01T12:13:14.015Z | 5th | 0004-12-26T00:00:00.000Z |
| Quarter (formatting) | Qo | 2019-01-01T12:13:14.015Z | 1st | 2019-01-01T00:00:00.000Z |
| | | 2019-04-01T12:13:14.015Z | 2nd | 2019-04-01T00:00:00.000Z |
| | QQQ | 2019-01-01T12:13:14.015Z | Q1 | 2019-01-01T00:00:00.000Z |
| | | 2019-04-01T12:13:14.015Z | Q2 | 2019-04-01T00:00:00.000Z |
| | QQQQ | 2019-01-01T12:13:14.015Z | 1st quarter | 2019-01-01T00:00:00.000Z |
| | | 2019-04-01T12:13:14.015Z | 2nd quarter | 2019-04-01T00:00:00.000Z |
| | QQQQQ | 2019-01-01T12:13:14.015Z | 1 | 2019-01-01T00:00:00.000Z |
| | | 2019-04-01T12:13:14.015Z | 2 | 2019-04-01T00:00:00.000Z |
| Quarter (stand-alone) | qo | 2019-01-01T12:13:14.015Z | 1st | 2019-01-01T00:00:00.000Z |
| | | 2019-04-01T12:13:14.015Z | 2nd | 2019-04-01T00:00:00.000Z |
| | qqq | 2019-01-01T12:13:14.015Z | Q1 | 2019-01-01T00:00:00.000Z |
| | | 2019-04-01T12:13:14.015Z | Q2 | 2019-04-01T00:00:00.000Z |
| | qqqq | 2019-01-01T12:13:14.015Z | 1st quarter | 2019-01-01T00:00:00.000Z |
| | | 2019-04-01T12:13:14.015Z | 2nd quarter | 2019-04-01T00:00:00.000Z |
| Month (formatting) | Mo | 2019-02-11T12:13:14.015Z | 2nd | 2019-02-01T00:00:00.000Z |
| | | 2019-07-10T12:13:14.015Z | 7th | 2019-07-01T00:00:00.000Z |
| | MMM | 2019-02-11T12:13:14.015Z | Feb | 2019-02-01T00:00:00.000Z |
| | | 2019-07-10T12:13:14.015Z | Jul | 2019-07-01T00:00:00.000Z |
| | MMMM | 2019-02-11T12:13:14.015Z | February | 2019-02-01T00:00:00.000Z |
| | | 2019-07-10T12:13:14.015Z | July | 2019-07-01T00:00:00.000Z |
| | MMMMM | 2019-02-11T12:13:14.015Z | F | 2019-02-01T00:00:00.000Z |
| | | 2019-07-10T12:13:14.015Z | J | 2019-01-01T00:00:00.000Z |
| Month (stand-alone) | Lo | 2019-02-11T12:13:14.015Z | 2nd | 2019-02-01T00:00:00.000Z |
| | | 2019-07-10T12:13:14.015Z | 7th | 2019-07-01T00:00:00.000Z |
| | LLL | 2019-02-11T12:13:14.015Z | Feb | 2019-02-01T00:00:00.000Z |
| | | 2019-07-10T12:13:14.015Z | Jul | 2019-07-01T00:00:00.000Z |
| | LLLL | 2019-02-11T12:13:14.015Z | February | 2019-02-01T00:00:00.000Z |
| | | 2019-07-10T12:13:14.015Z | July | 2019-07-01T00:00:00.000Z |
| | LLLLL | 2019-02-11T12:13:14.015Z | F | 2019-02-01T00:00:00.000Z |
| | | 2019-07-10T12:13:14.015Z | J | 2019-01-01T00:00:00.000Z |
| Local week of year | wo | 2019-01-01T12:13:14.015Z | 1st | 2018-12-30T00:00:00.000Z |
| | | 2019-12-01T12:13:14.015Z | 49th | 2019-12-01T00:00:00.000Z |
| ISO week of year | Io | 2019-01-01T12:13:14.015Z | 1st | 2018-12-31T00:00:00.000Z |
| | | 2019-12-01T12:13:14.015Z | 48th | 2019-11-25T00:00:00.000Z |
| Day of month | do | 2019-02-11T12:13:14.015Z | 11th | 2019-02-11T00:00:00.000Z |
| | | 2019-02-28T12:13:14.015Z | 28th | 2019-02-28T00:00:00.000Z |
| Day of year | Do | 2019-02-11T12:13:14.015Z | 42nd | 2019-02-11T00:00:00.000Z |
| | | 2019-12-31T12:13:14.015Z | 365th | 2019-12-31T00:00:00.000Z |
| Day of week (formatting) | E | 2019-02-11T12:13:14.015Z | Mon | 2019-02-11T00:00:00.000Z |
| | | 2019-02-15T12:13:14.015Z | Fri | 2019-02-15T00:00:00.000Z |
| | EE | 2019-02-11T12:13:14.015Z | Mon | 2019-02-11T00:00:00.000Z |
| | | 2019-02-15T12:13:14.015Z | Fri | 2019-02-15T00:00:00.000Z |
| | EEE | 2019-02-11T12:13:14.015Z | Mon | 2019-02-11T00:00:00.000Z |
| | | 2019-02-15T12:13:14.015Z | Fri | 2019-02-15T00:00:00.000Z |
| | EEEE | 2019-02-11T12:13:14.015Z | Monday | 2019-02-11T00:00:00.000Z |
| | | 2019-02-15T12:13:14.015Z | Friday | 2019-02-15T00:00:00.000Z |
| | EEEEE | 2019-02-11T12:13:14.015Z | M | 2019-02-11T00:00:00.000Z |
| | | 2019-02-15T12:13:14.015Z | F | 2019-02-15T00:00:00.000Z |
| | EEEEEE | 2019-02-11T12:13:14.015Z | Mo | 2019-02-11T00:00:00.000Z |
| | | 2019-02-15T12:13:14.015Z | Fr | 2019-02-15T00:00:00.000Z |
| ISO day of week (formatting) | io | 2019-02-11T12:13:14.015Z | 1st | 2019-02-11T00:00:00.000Z |
| | | 2019-02-15T12:13:14.015Z | 5th | 2019-02-15T00:00:00.000Z |
| | iii | 2019-02-11T12:13:14.015Z | Mon | 2019-02-11T00:00:00.000Z |
| | | 2019-02-15T12:13:14.015Z | Fri | 2019-02-15T00:00:00.000Z |
| | iiii | 2019-02-11T12:13:14.015Z | Monday | 2019-02-11T00:00:00.000Z |
| | | 2019-02-15T12:13:14.015Z | Friday | 2019-02-15T00:00:00.000Z |
| | iiiii | 2019-02-11T12:13:14.015Z | M | 2019-02-11T00:00:00.000Z |
| | | 2019-02-15T12:13:14.015Z | F | 2019-02-15T00:00:00.000Z |
| | iiiiii | 2019-02-11T12:13:14.015Z | Mo | 2019-02-11T00:00:00.000Z |
| | | 2019-02-15T12:13:14.015Z | Fr | 2019-02-15T00:00:00.000Z |
| Local day of week (formatting) | eo | 2019-02-11T12:13:14.015Z | 2nd | 2019-02-11T00:00:00.000Z |
| | | 2019-02-15T12:13:14.015Z | 6th | 2019-02-15T00:00:00.000Z |
| | eee | 2019-02-11T12:13:14.015Z | Mon | 2019-02-11T00:00:00.000Z |
| | | 2019-02-15T12:13:14.015Z | Fri | 2019-02-15T00:00:00.000Z |
| | eeee | 2019-02-11T12:13:14.015Z | Monday | 2019-02-11T00:00:00.000Z |
| | | 2019-02-15T12:13:14.015Z | Friday | 2019-02-15T00:00:00.000Z |
| | eeeee | 2019-02-11T12:13:14.015Z | M | 2019-02-11T00:00:00.000Z |
| | | 2019-02-15T12:13:14.015Z | F | 2019-02-15T00:00:00.000Z |
| | eeeeee | 2019-02-11T12:13:14.015Z | Mo | 2019-02-11T00:00:00.000Z |
| | | 2019-02-15T12:13:14.015Z | Fr | 2019-02-15T00:00:00.000Z |
| Local day of week (stand-alone) | co | 2019-02-11T12:13:14.015Z | 2nd | 2019-02-11T00:00:00.000Z |
| | | 2019-02-15T12:13:14.015Z | 6th | 2019-02-15T00:00:00.000Z |
| | ccc | 2019-02-11T12:13:14.015Z | Mon | 2019-02-11T00:00:00.000Z |
| | | 2019-02-15T12:13:14.015Z | Fri | 2019-02-15T00:00:00.000Z |
| | cccc | 2019-02-11T12:13:14.015Z | Monday | 2019-02-11T00:00:00.000Z |
| | | 2019-02-15T12:13:14.015Z | Friday | 2019-02-15T00:00:00.000Z |
| | ccccc | 2019-02-11T12:13:14.015Z | M | 2019-02-11T00:00:00.000Z |
| | | 2019-02-15T12:13:14.015Z | F | 2019-02-15T00:00:00.000Z |
| | cccccc | 2019-02-11T12:13:14.015Z | Mo | 2019-02-11T00:00:00.000Z |
| | | 2019-02-15T12:13:14.015Z | Fr | 2019-02-15T00:00:00.000Z |
| AM, PM | a | 2019-02-11T11:13:14.015Z | AM | 2019-02-11T00:00:00.000Z |
| | | 2019-02-11T14:13:14.015Z | PM | 2019-02-11T12:00:00.000Z |
| | | 2019-02-11T19:13:14.015Z | PM | 2019-02-11T12:00:00.000Z |
| | | 2019-02-11T02:13:14.015Z | AM | 2019-02-11T00:00:00.000Z |
| | aa | 2019-02-11T11:13:14.015Z | AM | 2019-02-11T00:00:00.000Z |
| | | 2019-02-11T14:13:14.015Z | PM | 2019-02-11T12:00:00.000Z |
| | | 2019-02-11T19:13:14.015Z | PM | 2019-02-11T12:00:00.000Z |
| | | 2019-02-11T02:13:14.015Z | AM | 2019-02-11T00:00:00.000Z |
| | aaa | 2019-02-11T11:13:14.015Z | am | 2019-02-11T00:00:00.000Z |
| | | 2019-02-11T14:13:14.015Z | pm | 2019-02-11T12:00:00.000Z |
| | | 2019-02-11T19:13:14.015Z | pm | 2019-02-11T12:00:00.000Z |
| | | 2019-02-11T02:13:14.015Z | am | 2019-02-11T00:00:00.000Z |
| | aaaa | 2019-02-11T11:13:14.015Z | a.m. | 2019-02-11T00:00:00.000Z |
| | | 2019-02-11T14:13:14.015Z | p.m. | 2019-02-11T12:00:00.000Z |
| | | 2019-02-11T19:13:14.015Z | p.m. | 2019-02-11T12:00:00.000Z |
| | | 2019-02-11T02:13:14.015Z | a.m. | 2019-02-11T00:00:00.000Z |
| | aaaaa | 2019-02-11T11:13:14.015Z | a | 2019-02-11T00:00:00.000Z |
| | | 2019-02-11T14:13:14.015Z | p | 2019-02-11T12:00:00.000Z |
| | | 2019-02-11T19:13:14.015Z | p | 2019-02-11T12:00:00.000Z |
| | | 2019-02-11T02:13:14.015Z | a | 2019-02-11T00:00:00.000Z |
| AM, PM, noon, midnight | b | 2019-02-11T11:13:14.015Z | AM | 2019-02-11T00:00:00.000Z |
| | | 2019-02-11T14:13:14.015Z | PM | 2019-02-11T12:00:00.000Z |
| | | 2019-02-11T19:13:14.015Z | PM | 2019-02-11T12:00:00.000Z |
| | | 2019-02-11T02:13:14.015Z | AM | 2019-02-11T00:00:00.000Z |
| | bb | 2019-02-11T11:13:14.015Z | AM | 2019-02-11T00:00:00.000Z |
| | | 2019-02-11T14:13:14.015Z | PM | 2019-02-11T12:00:00.000Z |
| | | 2019-02-11T19:13:14.015Z | PM | 2019-02-11T12:00:00.000Z |
| | | 2019-02-11T02:13:14.015Z | AM | 2019-02-11T00:00:00.000Z |
| | bbb | 2019-02-11T11:13:14.015Z | am | 2019-02-11T00:00:00.000Z |
| | | 2019-02-11T14:13:14.015Z | pm | 2019-02-11T12:00:00.000Z |
| | | 2019-02-11T19:13:14.015Z | pm | 2019-02-11T12:00:00.000Z |
| | | 2019-02-11T02:13:14.015Z | am | 2019-02-11T00:00:00.000Z |
| | bbbb | 2019-02-11T11:13:14.015Z | a.m. | 2019-02-11T00:00:00.000Z |
| | | 2019-02-11T14:13:14.015Z | p.m. | 2019-02-11T12:00:00.000Z |
| | | 2019-02-11T19:13:14.015Z | p.m. | 2019-02-11T12:00:00.000Z |
| | | 2019-02-11T02:13:14.015Z | a.m. | 2019-02-11T00:00:00.000Z |
| | bbbbb | 2019-02-11T11:13:14.015Z | a | 2019-02-11T00:00:00.000Z |
| | | 2019-02-11T14:13:14.015Z | p | 2019-02-11T12:00:00.000Z |
| | | 2019-02-11T19:13:14.015Z | p | 2019-02-11T12:00:00.000Z |
| | | 2019-02-11T02:13:14.015Z | a | 2019-02-11T00:00:00.000Z |
| Flexible day period | B | 2019-02-11T11:13:14.015Z | in the morning | 2019-02-11T04:00:00.000Z |
| | | 2019-02-11T14:13:14.015Z | in the afternoon | 2019-02-11T12:00:00.000Z |
| | | 2019-02-11T19:13:14.015Z | in the evening | 2019-02-11T17:00:00.000Z |
| | | 2019-02-11T02:13:14.015Z | at night | 2019-02-11T00:00:00.000Z |
| | BB | 2019-02-11T11:13:14.015Z | in the morning | 2019-02-11T04:00:00.000Z |
| | | 2019-02-11T14:13:14.015Z | in the afternoon | 2019-02-11T12:00:00.000Z |
| | | 2019-02-11T19:13:14.015Z | in the evening | 2019-02-11T17:00:00.000Z |
| | | 2019-02-11T02:13:14.015Z | at night | 2019-02-11T00:00:00.000Z |
| | BBB | 2019-02-11T11:13:14.015Z | in the morning | 2019-02-11T04:00:00.000Z |
| | | 2019-02-11T14:13:14.015Z | in the afternoon | 2019-02-11T12:00:00.000Z |
| | | 2019-02-11T19:13:14.015Z | in the evening | 2019-02-11T17:00:00.000Z |
| | | 2019-02-11T02:13:14.015Z | at night | 2019-02-11T00:00:00.000Z |
| | BBBB | 2019-02-11T11:13:14.015Z | in the morning | 2019-02-11T04:00:00.000Z |
| | | 2019-02-11T14:13:14.015Z | in the afternoon | 2019-02-11T12:00:00.000Z |
| | | 2019-02-11T19:13:14.015Z | in the evening | 2019-02-11T17:00:00.000Z |
| | | 2019-02-11T02:13:14.015Z | at night | 2019-02-11T00:00:00.000Z |
| | BBBBB | 2019-02-11T11:13:14.015Z | in the morning | 2019-02-11T04:00:00.000Z |
| | | 2019-02-11T14:13:14.015Z | in the afternoon | 2019-02-11T12:00:00.000Z |
| | | 2019-02-11T19:13:14.015Z | in the evening | 2019-02-11T17:00:00.000Z |
| | | 2019-02-11T02:13:14.015Z | at night | Invalid Date |
| Hour [1-12] | ho | 2019-02-11T11:13:14.015Z | 11th | 2019-02-11T11:00:00.000Z |
| | | 2019-02-11T23:13:14.015Z | 11th | 2019-02-11T23:00:00.000Z |
| Hour [0-23] | Ho | 2019-02-11T11:13:14.015Z | 11th | 2019-02-11T11:00:00.000Z |
| | | 2019-02-11T23:13:14.015Z | 23rd | 2019-02-11T23:00:00.000Z |
| Hour [0-11] | Ko | 2019-02-11T11:13:14.015Z | 11th | 2019-02-11T11:00:00.000Z |
| | | 2019-02-11T23:13:14.015Z | 11th | 2019-02-11T23:00:00.000Z |
| Hour [1-24] | ko | 2019-02-11T11:13:14.015Z | 11th | 2019-02-11T11:00:00.000Z |
| | | 2019-02-11T23:13:14.015Z | 23rd | 2019-02-11T23:00:00.000Z |
| Minute | mo | 2019-01-01T12:01:14.015Z | 1st | 2019-01-01T12:01:00.000Z |
| | | 2019-04-01T12:55:14.015Z | 55th | 2019-04-01T12:55:00.000Z |
| Second | so | 2019-01-01T12:13:01.015Z | 1st | 2019-01-01T12:13:01.000Z |
| | | 2019-04-01T12:13:55.015Z | 55th | 2019-04-01T12:13:55.000Z |
| Long localized date | P | 1987-02-11T12:13:14.015Z | 02/11/1987 | 1987-02-11T00:00:00.000Z |
| | | 1453-05-29T23:59:59.999Z | 05/29/1453 | 1453-05-29T00:00:00.000Z |
| | PP | 1987-02-11T12:13:14.015Z | Feb 11, 1987 | 1987-02-11T00:00:00.000Z |
| | | 1453-05-29T23:59:59.999Z | May 29, 1453 | 1453-05-29T00:00:00.000Z |
| | PPP | 1987-02-11T12:13:14.015Z | February 11th, 1987 | 1987-02-11T00:00:00.000Z |
| | | 1453-05-29T23:59:59.999Z | May 29th, 1453 | 1453-05-29T00:00:00.000Z |
| | PPPP | 1987-02-11T12:13:14.015Z | Wednesday, February 11th, 1987 | 1987-02-11T00:00:00.000Z |
| | | 1453-05-29T23:59:59.999Z | Sunday, May 29th, 1453 | 1453-05-29T00:00:00.000Z |
| Long localized time | p | 1987-02-11T12:13:14.015Z | 12:13 PM | 1987-02-11T12:13:00.000Z |
| | | 1453-05-29T23:59:59.999Z | 11:59 PM | 1453-05-29T23:59:00.000Z |
| | pp | 1987-02-11T12:13:14.015Z | 12:13:14 PM | 1987-02-11T12:13:14.000Z |
| | | 1453-05-29T23:59:59.999Z | 11:59:59 PM | 1453-05-29T23:59:59.000Z |
| | ppp | 1987-02-11T12:13:14.015Z | 12:13:14 PM GMT+0 | Errored |
| | | 1453-05-29T23:59:59.999Z | 11:59:59 PM GMT+0 | Errored |
| | pppp | 1987-02-11T12:13:14.015Z | 12:13:14 PM GMT+00:00 | Errored |
| | | 1453-05-29T23:59:59.999Z | 11:59:59 PM GMT+00:00 | Errored |
| Combination of date and time | Pp | 1987-02-11T12:13:14.015Z | 02/11/1987, 12:13 PM | 1987-02-11T12:13:00.000Z |
| | | 1453-05-29T23:59:59.999Z | 05/29/1453, 11:59 PM | 1453-05-29T23:59:00.000Z |
| | PPpp | 1987-02-11T12:13:14.015Z | Feb 11, 1987, 12:13:14 PM | 1987-02-11T12:13:14.000Z |
| | | 1453-05-29T23:59:59.999Z | May 29, 1453, 11:59:59 PM | 1453-05-29T23:59:59.000Z |
| | PPPppp | 1987-02-11T12:13:14.015Z | February 11th, 1987 at 12:13:14 PM GMT+0 | Errored |
| | | 1453-05-29T23:59:59.999Z | May 29th, 1453 at 11:59:59 PM GMT+0 | Errored |
| | PPPPpppp | 1987-02-11T12:13:14.015Z | Wednesday, February 11th, 1987 at 12:13:14 PM GMT+00:00 | Errored |
| | | 1453-05-29T23:59:59.999Z | Sunday, May 29th, 1453 at 11:59:59 PM GMT+00:00 | Errored |
## `formatDistance`
If now is January 1st, 2000, 00:00.
| Date | Result | `includeSeconds: true` | `addSuffix: true` |
| ------------------------ | ------------------ | ---------------------- | ---------------------- |
| 2006-01-01T00:00:00.000Z | about 6 years | about 6 years | in about 6 years |
| 2005-01-01T00:00:00.000Z | about 5 years | about 5 years | in about 5 years |
| 2004-01-01T00:00:00.000Z | about 4 years | about 4 years | in about 4 years |
| 2003-01-01T00:00:00.000Z | about 3 years | about 3 years | in about 3 years |
| 2002-01-01T00:00:00.000Z | about 2 years | about 2 years | in about 2 years |
| 2001-06-01T00:00:00.000Z | over 1 year | over 1 year | in over 1 year |
| 2001-02-01T00:00:00.000Z | about 1 year | about 1 year | in about 1 year |
| 2001-01-01T00:00:00.000Z | about 1 year | about 1 year | in about 1 year |
| 2000-06-01T00:00:00.000Z | 5 months | 5 months | in 5 months |
| 2000-03-01T00:00:00.000Z | 2 months | 2 months | in 2 months |
| 2000-02-01T00:00:00.000Z | about 1 month | about 1 month | in about 1 month |
| 2000-01-15T00:00:00.000Z | 14 days | 14 days | in 14 days |
| 2000-01-02T00:00:00.000Z | 1 day | 1 day | in 1 day |
| 2000-01-01T06:00:00.000Z | about 6 hours | about 6 hours | in about 6 hours |
| 2000-01-01T01:00:00.000Z | about 1 hour | about 1 hour | in about 1 hour |
| 2000-01-01T00:45:00.000Z | about 1 hour | about 1 hour | in about 1 hour |
| 2000-01-01T00:30:00.000Z | 30 minutes | 30 minutes | in 30 minutes |
| 2000-01-01T00:15:00.000Z | 15 minutes | 15 minutes | in 15 minutes |
| 2000-01-01T00:01:00.000Z | 1 minute | 1 minute | in 1 minute |
| 2000-01-01T00:00:25.000Z | less than a minute | half a minute | in less than a minute |
| 2000-01-01T00:00:15.000Z | less than a minute | less than 20 seconds | in less than a minute |
| 2000-01-01T00:00:05.000Z | less than a minute | less than 10 seconds | in less than a minute |
| 2000-01-01T00:00:00.000Z | less than a minute | less than 5 seconds | less than a minute ago |
| 1999-12-31T23:59:55.000Z | less than a minute | less than 10 seconds | less than a minute ago |
| 1999-12-31T23:59:45.000Z | less than a minute | less than 20 seconds | less than a minute ago |
| 1999-12-31T23:59:35.000Z | less than a minute | half a minute | less than a minute ago |
| 1999-12-31T23:59:00.000Z | 1 minute | 1 minute | 1 minute ago |
| 1999-12-31T23:45:00.000Z | 15 minutes | 15 minutes | 15 minutes ago |
| 1999-12-31T23:30:00.000Z | 30 minutes | 30 minutes | 30 minutes ago |
| 1999-12-31T23:15:00.000Z | about 1 hour | about 1 hour | about 1 hour ago |
| 1999-12-31T23:00:00.000Z | about 1 hour | about 1 hour | about 1 hour ago |
| 1999-12-31T18:00:00.000Z | about 6 hours | about 6 hours | about 6 hours ago |
| 1999-12-30T00:00:00.000Z | 2 days | 2 days | 2 days ago |
| 1999-12-15T00:00:00.000Z | 17 days | 17 days | 17 days ago |
| 1999-12-01T00:00:00.000Z | about 1 month | about 1 month | about 1 month ago |
| 1999-11-01T00:00:00.000Z | 2 months | 2 months | 2 months ago |
| 1999-06-01T00:00:00.000Z | 7 months | 7 months | 7 months ago |
| 1999-01-01T00:00:00.000Z | about 1 year | about 1 year | about 1 year ago |
| 1998-12-01T00:00:00.000Z | about 1 year | about 1 year | about 1 year ago |
| 1998-06-01T00:00:00.000Z | over 1 year | over 1 year | over 1 year ago |
| 1998-01-01T00:00:00.000Z | about 2 years | about 2 years | about 2 years ago |
| 1997-01-01T00:00:00.000Z | about 3 years | about 3 years | about 3 years ago |
| 1996-01-01T00:00:00.000Z | about 4 years | about 4 years | about 4 years ago |
| 1995-01-01T00:00:00.000Z | about 5 years | about 5 years | about 5 years ago |
| 1994-01-01T00:00:00.000Z | about 6 years | about 6 years | about 6 years ago |
## `formatDistanceStrict`
If now is January 1st, 2000, 00:00.
| Date | Result | `addSuffix: true` | With forced unit (i.e. `hour`) |
| ------------------------ | ---------- | ----------------- | ------------------------------ |
| 2006-01-01T00:00:00.000Z | 6 years | in 6 years | 52608 hours |
| 2005-01-01T00:00:00.000Z | 5 years | in 5 years | 43848 hours |
| 2004-01-01T00:00:00.000Z | 4 years | in 4 years | 35064 hours |
| 2003-01-01T00:00:00.000Z | 3 years | in 3 years | 26304 hours |
| 2002-01-01T00:00:00.000Z | 2 years | in 2 years | 17544 hours |
| 2001-06-01T00:00:00.000Z | 1 year | in 1 year | 12408 hours |
| 2001-02-01T00:00:00.000Z | 1 year | in 1 year | 9528 hours |
| 2001-01-01T00:00:00.000Z | 1 year | in 1 year | 8784 hours |
| 2000-06-01T00:00:00.000Z | 5 months | in 5 months | 3648 hours |
| 2000-03-01T00:00:00.000Z | 2 months | in 2 months | 1440 hours |
| 2000-02-01T00:00:00.000Z | 1 month | in 1 month | 744 hours |
| 2000-01-15T00:00:00.000Z | 14 days | in 14 days | 336 hours |
| 2000-01-02T00:00:00.000Z | 1 day | in 1 day | 24 hours |
| 2000-01-01T06:00:00.000Z | 6 hours | in 6 hours | 6 hours |
| 2000-01-01T01:00:00.000Z | 1 hour | in 1 hour | 1 hour |
| 2000-01-01T00:45:00.000Z | 45 minutes | in 45 minutes | 1 hour |
| 2000-01-01T00:30:00.000Z | 30 minutes | in 30 minutes | 1 hour |
| 2000-01-01T00:15:00.000Z | 15 minutes | in 15 minutes | 0 hours |
| 2000-01-01T00:01:00.000Z | 1 minute | in 1 minute | 0 hours |
| 2000-01-01T00:00:25.000Z | 25 seconds | in 25 seconds | 0 hours |
| 2000-01-01T00:00:15.000Z | 15 seconds | in 15 seconds | 0 hours |
| 2000-01-01T00:00:05.000Z | 5 seconds | in 5 seconds | 0 hours |
| 2000-01-01T00:00:00.000Z | 0 seconds | 0 seconds ago | 0 hours |
| 1999-12-31T23:59:55.000Z | 5 seconds | 5 seconds ago | 0 hours |
| 1999-12-31T23:59:45.000Z | 15 seconds | 15 seconds ago | 0 hours |
| 1999-12-31T23:59:35.000Z | 25 seconds | 25 seconds ago | 0 hours |
| 1999-12-31T23:59:00.000Z | 1 minute | 1 minute ago | 0 hours |
| 1999-12-31T23:45:00.000Z | 15 minutes | 15 minutes ago | 0 hours |
| 1999-12-31T23:30:00.000Z | 30 minutes | 30 minutes ago | 1 hour |
| 1999-12-31T23:15:00.000Z | 45 minutes | 45 minutes ago | 1 hour |
| 1999-12-31T23:00:00.000Z | 1 hour | 1 hour ago | 1 hour |
| 1999-12-31T18:00:00.000Z | 6 hours | 6 hours ago | 6 hours |
| 1999-12-30T00:00:00.000Z | 2 days | 2 days ago | 48 hours |
| 1999-12-15T00:00:00.000Z | 17 days | 17 days ago | 408 hours |
| 1999-12-01T00:00:00.000Z | 1 month | 1 month ago | 744 hours |
| 1999-11-01T00:00:00.000Z | 2 months | 2 months ago | 1464 hours |
| 1999-06-01T00:00:00.000Z | 7 months | 7 months ago | 5136 hours |
| 1999-01-01T00:00:00.000Z | 1 year | 1 year ago | 8760 hours |
| 1998-12-01T00:00:00.000Z | 1 year | 1 year ago | 9504 hours |
| 1998-06-01T00:00:00.000Z | 2 years | 2 years ago | 13896 hours |
| 1998-01-01T00:00:00.000Z | 2 years | 2 years ago | 17520 hours |
| 1997-01-01T00:00:00.000Z | 3 years | 3 years ago | 26280 hours |
| 1996-01-01T00:00:00.000Z | 4 years | 4 years ago | 35064 hours |
| 1995-01-01T00:00:00.000Z | 5 years | 5 years ago | 43824 hours |
| 1994-01-01T00:00:00.000Z | 6 years | 6 years ago | 52584 hours |
## `formatRelative`
If now is January 1st, 2000, 00:00.
| Date | Result |
| ------------------------ | ----------------------- |
| 2000-01-10T00:00:00.000Z | 01/10/2000 |
| 2000-01-05T00:00:00.000Z | Wednesday at 12:00 AM |
| 2000-01-02T00:00:00.000Z | tomorrow at 12:00 AM |
| 2000-01-01T00:00:00.000Z | today at 12:00 AM |
| 1999-12-31T00:00:00.000Z | yesterday at 12:00 AM |
| 1999-12-27T00:00:00.000Z | last Monday at 12:00 AM |
| 1999-12-21T00:00:00.000Z | 12/21/1999 |
## `formatDuration`
| Duration | Result |
| ------------- | --------- |
| {"years":0} | 0 years |
| {"years":1} | 1 year |
| {"years":2} | 2 years |
| {"months":0} | 0 months |
| {"months":1} | 1 month |
| {"months":2} | 2 months |
| {"weeks":0} | 0 weeks |
| {"weeks":1} | 1 week |
| {"weeks":2} | 2 weeks |
| {"days":0} | 0 days |
| {"days":1} | 1 day |
| {"days":2} | 2 days |
| {"hours":0} | 0 hours |
| {"hours":1} | 1 hour |
| {"hours":2} | 2 hours |
| {"minutes":0} | 0 minutes |
| {"minutes":1} | 1 minute |
| {"minutes":2} | 2 minutes |
| {"seconds":0} | 0 seconds |
| {"seconds":1} | 1 second |
| {"seconds":2} | 2 seconds |

View File

@@ -1 +0,0 @@
export { default as fil } from './fil';

View File

@@ -1,273 +0,0 @@
/* eslint-disable no-unused-vars */
import type {
Day,
Era,
FirstWeekContainsDate,
Month,
Quarter,
Unit,
} from '../types';
import type {
BuildLocalizeFnArgCallback,
LocalizeUnitValues,
LocalizeUnitValuesIndex,
} from './_lib/buildLocalizeFn';
export interface Locale {
code: string;
formatDistance: FormatDistanceFn;
formatRelative: FormatRelativeFn;
localize: Localize;
formatLong: FormatLong;
match: Match;
options?: LocaleOptions;
}
export interface LocaleOptions {
weekStartsOn?: Day;
firstWeekContainsDate?: FirstWeekContainsDate;
}
export type FormatDistanceToken =
| 'lessThanXSeconds'
| 'xSeconds'
| 'halfAMinute'
| 'lessThanXMinutes'
| 'xMinutes'
| 'aboutXHours'
| 'xHours'
| 'xDays'
| 'aboutXWeeks'
| 'xWeeks'
| 'aboutXMonths'
| 'xMonths'
| 'aboutXYears'
| 'xYears'
| 'overXYears'
| 'almostXYears';
export type FormatDistanceLocale<Value> = {
[token in FormatDistanceToken]: Value;
};
export interface FormatDistanceFnOptions {
addSuffix?: boolean;
comparison?: -1 | 0 | 1;
}
export type FormatDistanceTokenFn = (
count: number,
options?: FormatDistanceOptions
) => string;
export interface FormatDistanceOptions {
addSuffix?: boolean;
comparison?: -1 | 0 | 1;
}
export type FormatDistanceFn = (
token: FormatDistanceToken,
count: number,
options?: FormatDistanceOptions
) => string;
export type FormatRelativeTokenFn = (
date: Date | number,
baseDate: Date | number,
options?: { weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6 }
) => string;
export type FormatRelativeToken =
| 'lastWeek'
| 'yesterday'
| 'today'
| 'tomorrow'
| 'nextWeek'
| 'other';
export interface FormatRelativeFnOptions {
weekStartsOn?: Day;
locale?: Locale;
}
export type FormatRelativeFn = (
token: FormatRelativeToken,
date: Date,
baseDate: Date,
options?: FormatRelativeFnOptions
) => string;
// TODO: You're real champion if you're actually get back to it. Proud of you!
// Try to get rid of this and (especially) ArgCallback types because the only
// case when it's helpful is when using quarter. Maybe.
export type LocalizeUnitIndex<Unit extends LocaleUnit | number> =
Unit extends LocaleUnit
? LocalizeUnitValuesIndex<LocalizeUnitValues<Unit>>
: number;
export type LocalizeFn<
Result extends LocaleUnit | number,
ArgCallback extends BuildLocalizeFnArgCallback<Result> | undefined = undefined
> = (
value: ArgCallback extends undefined
? Result
: Result extends Quarter
? Quarter
: LocalizeUnitIndex<Result>,
options?: {
width?: LocalePatternWidth;
context?: 'formatting' | 'standalone';
unit?: Unit;
}
) => string;
export interface Localize {
ordinalNumber: LocalizeFn<
number,
BuildLocalizeFnArgCallback<number> | undefined
>;
era: LocalizeFn<Era, undefined>;
quarter: LocalizeFn<Quarter, BuildLocalizeFnArgCallback<Quarter>>;
month: LocalizeFn<Month, undefined>;
day: LocalizeFn<Day, undefined>;
dayPeriod: LocalizeFn<LocaleDayPeriod, undefined>;
}
export interface BuildMatchFnArgs<
Result extends LocaleUnit,
DefaultMatchWidth extends LocalePatternWidth,
DefaultParseWidth extends LocalePatternWidth
> {
matchPatterns: MatchPatterns<DefaultMatchWidth>;
defaultMatchWidth: DefaultMatchWidth;
parsePatterns: ParsePatterns<Result, DefaultParseWidth>;
defaultParseWidth: DefaultParseWidth;
valueCallback?: MatchValueCallback<
Result extends LocaleDayPeriod ? string : number,
Result
>;
}
export type MatchPatterns<DefaultWidth extends LocalePatternWidth> = {
[pattern in LocalePatternWidth]?: RegExp;
} & { [key in DefaultWidth]: RegExp };
export type ParsePatterns<
Result extends LocaleUnit,
DefaultWidth extends LocalePatternWidth
> = {
[pattern in LocalePatternWidth]?: ParsePattern<Result>;
} & { [key in DefaultWidth]: ParsePattern<Result> };
export type ParsePattern<Result extends LocaleUnit> =
Result extends LocaleDayPeriod
? Record<LocaleDayPeriod, RegExp>
: Result extends Quarter
? readonly [RegExp, RegExp, RegExp, RegExp]
: Result extends Era
? readonly [RegExp, RegExp]
: Result extends Day
? readonly [RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp]
: Result extends Month
? readonly [
RegExp,
RegExp,
RegExp,
RegExp,
RegExp,
RegExp,
RegExp,
RegExp,
RegExp,
RegExp,
RegExp,
RegExp
]
: never;
export type BuildMatchFn<
Result extends LocaleUnit,
DefaultMatchWidth extends LocalePatternWidth,
DefaultParseWidth extends LocalePatternWidth
> = (
args: BuildMatchFnArgs<Result, DefaultMatchWidth, DefaultParseWidth>
) => MatchFn<Result>;
export type MatchFn<Result> = (
str: string,
options?: {
width?: LocalePatternWidth;
valueCallback?: MatchValueCallback<string | Result, Result>;
}
) => { value: Result; rest: string } | null;
export type MatchValueCallback<Arg, Result> = (value: Arg) => Result;
export interface Match {
ordinalNumber: MatchFn<number>;
era: MatchFn<Era>;
quarter: MatchFn<Quarter>;
month: MatchFn<Month>;
day: MatchFn<Day>;
dayPeriod: MatchFn<LocaleDayPeriod>;
}
export type LocaleOrdinalUnit =
| 'second'
| 'minute'
| 'hour'
| 'day'
| 'week'
| 'month'
| 'quarter'
| 'year'
| 'date'
| 'dayOfYear';
export type LocalePatternWidth =
| 'narrow'
| 'short'
| 'abbreviated'
| 'wide'
| 'any';
export type LocaleDayPeriod =
| 'am'
| 'pm'
| 'midnight'
| 'noon'
| 'morning'
| 'afternoon'
| 'evening'
| 'night';
export type LocaleOptionUnit =
| 'year'
| 'quarter'
| 'month'
| 'week'
| 'date'
| 'dayOfYear'
| 'day'
| 'hour'
| 'minute'
| 'second';
export type FormatLongWidth = 'full' | 'long' | 'medium' | 'short' | 'any';
export type DateTimeFormat = { [format in FormatLongWidth]: string };
export type LocaleUnit = Era | Quarter | Month | Day | LocaleDayPeriod;
export interface FormatLong {
date: FormatLongFn;
time: FormatLongFn;
dateTime: FormatLongFn;
}
export interface FormatLongFnOptions {
width?: FormatLongWidth;
}
export type FormatLongFn = (options: FormatLongFnOptions) => string;

File diff suppressed because it is too large Load Diff