Date: 2024-04-29
Title: Date Format Utility with date-fns
Date Format Utility with date-fns
Introduction
This document describes the use of the DateFormat
enum in conjunction with date-fns
to standardize date formatting across a JavaScript/TypeScript project. By encapsulating commonly used date format strings into an enum, we enhance code readability, maintainability, and reduce the risk of typos and inconsistencies.
Overview
The DateFormat
enum includes a comprehensive list of date format options that can be used with the date-fns
library to format dates. This approach standardizes date formatting throughout the application and ensures consistency across different parts of the application.
Installation
First, ensure that you have date-fns
installed in your project. If not, you can add it by running:
npm install date-fns
Usage
Here’s how to use the DateFormat
enum in your project:
Basic Usage
Import the enum and the format
function from date-fns
wherever you need to format dates:
import { format } from 'date-fns';
import { DateFormat } from 'date-fns-format';
const today = new Date();
const formattedDate = format(today, DateFormat.YearFourDigits);
console.log('Formatted Year:', formattedDate);
Advanced Usage
You can use the enum in more complex scenarios such as components or services where multiple date formats are required:
import { format } from 'date-fns';
import { DateFormat } from './path/to/DateFormat';
const logFormattedDates = (date: Date) => {
console.log('Full Date:', format(date, DateFormat.LongLocalizedDate));
console.log('Month:', format(date, DateFormat.MonthFull));
console.log('Weekday:', format(date, DateFormat.DayOfWeekFull));
}
Benefits
-Consistency*: Using the enum ensures that date formats are consistent throughout the application.
-Maintenance*: Easy to update and maintain date formats in one location.
-Readability*: More readable codebase with clear references to date formats instead of raw strings.
Conclusion
Using the DateFormat
enum with date-fns
enhances your project's date handling by providing a clear, maintainable method for dealing with date formats. This method reduces errors and improves the development experience.
Table Display
Accepted patterns:
Unit | Pattern | Result examples | Notes |
---|
Era | G..GGG | AD, BC | |
| GGGG | Anno Domini, Before Christ | 2 |
| GGGGG | A, B | |
Calendar year | y | 44, 1, 1900, 2017 | 5 |
| yo | 44th, 1st, 0th, 17th | 5,7 |
| yy | 44, 01, 00, 17 | 5 |
| yyy | 044, 001, 1900, 2017 | 5 |
| yyyy | 0044, 0001, 1900, 2017 | 5 |
| yyyyy | ... | 3,5 |
Local week-numbering year | Y | 44, 1, 1900, 2017 | 5 |
| Yo | 44th, 1st, 1900th, 2017th | 5,7 |
| YY | 44, 01, 00, 17 | 5,8 |
| YYY | 044, 001, 1900, 2017 | 5 |
| YYYY | 0044, 0001, 1900, 2017 | 5,8 |
| YYYYY | ... | 3,5 |
ISO week-numbering year | R | -43, 0, 1, 1900, 2017 | 5,7 |
| RR | -43, 00, 01, 1900, 2017 | 5,7 |
| RRR | -043, 000, 001, 1900, 2017 | 5,7 |
| RRRR | -0043, 0000, 0001, 1900, 2017 | 5,7 |
| RRRRR | ... | 3,5,7 |
Extended year | u | -43, 0, 1, 1900, 2017 | 5 |
| uu | -43, 01, 1900, 2017 | 5 |
| uuu | -043, 001, 1900, 2017 | 5 |
| uuuu | -0043, 0001, 1900, 2017 | 5 |
| uuuuu | ... | 3,5 |
Quarter (formatting) | Q | 1, 2, 3, 4 | |
| Qo | 1st, 2nd, 3rd, 4th | 7 |
| QQ | 01, 02, 03, 04 | |
| QQQ | Q1, Q2, Q3, Q4 | |
| QQQQ | 1st quarter, 2nd quarter, ... | 2 |
| QQQQQ | 1, 2, 3, 4 | 4 |
Quarter (stand-alone) | q | 1, 2, 3, 4 | |
| qo | 1st, 2nd, 3rd, 4th | 7 |
| qq | 01, 02, 03, 04 | |
| qqq | Q1, Q2, Q3, Q4 | |
| qqqq | 1st quarter, 2nd quarter, ... | 2 |
| qqqqq | 1, 2, 3, 4 | 4 |
Month (formatting) | M | 1, 2, ..., 12 | |
| Mo | 1st, 2nd, ..., 12th | 7 |
| MM | 01, 02, ..., 12 | |
| MMM | Jan, Feb, ..., Dec | |
| MMMM | January, February, ..., December | 2 |
| MMMMM | J, F, ..., D | |
Month (stand-alone) | L | 1, 2, ..., 12 | |
| Lo | 1st, 2nd, ..., 12th | 7 |
| LL | 01, 02, ..., 12 | |
| LLL | Jan, Feb, ..., Dec | |
| LLLL | January, February, ..., December | 2 |
| LLLLL | J, F, ..., D | |
Local week of year | w | 1, 2, ..., 53 | |
| wo | 1st, 2nd, ..., 53th | 7 |
| ww | 01, 02, ..., 53 | |
ISO week of year | I | 1, 2, ..., 53 | 7 |
| Io | 1st, 2nd, ..., 53th | 7 |
| II | 01, 02, ..., 53 | 7 |
Day of month | d | 1, 2, ..., 31 | |
| do | 1st, 2nd, ..., 31st | 7 |
| dd | 01, 02, ..., 31 | |
Day of year | D | 1, 2, ..., 365, 366 | 9 |
| Do | 1st, 2nd, ..., 365th, 366th | 7 |
| DD | 01, 02, ..., 365, 366 | 9 |
| DDD | 001, 002, ..., 365, 366 | |
| DDDD | ... | 3 |
Day of week (formatting) | E..EEE | Mon, Tue, Wed, ..., Sun | |
| EEEE | Monday, Tuesday, ..., Sunday | 2 |
| EEEEE | M, T, W, T, F, S, S | |
| EEEEEE | Mo, Tu, We, Th, Fr, Sa, Su | |
ISO day of week (formatting) | i | 1, 2, 3, ..., 7 | 7 |
| io | 1st, 2nd, ..., 7th | 7 |
| ii | 01, 02, ..., 07 | 7 |
| iii | Mon, Tue, Wed, ..., Sun | 7 |
| iiii | Monday, Tuesday, ..., Sunday | 2,7 |
| iiiii | M, T, W, T, F, S, S | 7 |
| iiiiii | Mo, Tu, We, Th, Fr, Sa, Su | 7 |
Local day of week (formatting) | e | 2, 3, 4, ..., 1 | |
| eo | 2nd, 3rd, ..., 1st | 7 |
| ee | 02, 03, ..., 01 | |
| eee | Mon, Tue, Wed, ..., Sun | |
| eeee | Monday, Tuesday, ..., Sunday | 2 |
| eeeee | M, T, W, T, F, S, S | |
| eeeeee | Mo, Tu, We, Th, Fr, Sa, Su | |
Local day of week (stand-alone) | c | 2, 3, 4, ..., 1 | |
| co | 2nd, 3rd, ..., 1st | 7 |
| cc | 02, 03, ..., 01 | |
| ccc | Mon, Tue, Wed, ..., Sun | |
| cccc | Monday, Tuesday, ..., Sunday | 2 |
| ccccc | M, T, W, T, F, S, S | |
| cccccc | Mo, Tu, We, Th, Fr, Sa, Su | |
AM, PM | a..aa | AM, PM | |
| aaa | am, pm | |
| aaaa | a.m., p.m. | 2 |
| aaaaa | a, p | |
AM, PM, noon, midnight | b..bb | AM, PM, noon, midnight | |
| bbb | am, pm, noon, midnight | |
| bbbb | a.m., p.m., noon, midnight | 2 |
| bbbbb | a, p, n, mi | |
Flexible day period | B..BBB | at night, in the morning, ... | |
| BBBB | at night, in the morning, ... | 2 |
| BBBBB | at night, in the morning, ... | |
Hour [1-12] | h | 1, 2, ..., 11, 12 | |
| ho | 1st, 2nd, ..., 11th, 12th | 7 |
| hh | 01, 02, ..., 11, 12 | |
Hour [0-23] | H | 0, 1, 2, ..., 23 | |
| Ho | 0th, 1st, 2nd, ..., 23rd | 7 |
| HH | 00, 01, 02, ..., 23 | |
Hour [0-11] | K | 1, 2, ..., 11, 0 | |
| Ko | 1st, 2nd, ..., 11th, 0th | 7 |
| KK | 01, 02, ..., 11, 00 | |
Hour [1-24] | k | 24, 1, 2, ..., 23 | |
| ko | 24th, 1st, 2nd, ..., 23rd | 7 |
| kk | 24, 01, 02, ..., 23 | |
Minute | m | 0, 1, ..., 59 | |
| mo | 0th, 1st, ..., 59th | 7 |
| mm | 00, 01, ..., 59 | |
Second | s | 0, 1, ..., 59 | |
| so | 0th, 1st, ..., 59th | 7 |
| ss | 00, 01, ..., 59 | |
Fraction of second | S | 0, 1, ..., 9 | |
| SS | 00, 01, ..., 99 | |
| SSS | 000, 001, ..., 999 | |
| SSSS | ... | 3 |
Timezone (ISO-8601 w/ Z) | X | -08, +0530, Z | |
| XX | -0800, +0530, Z | |
| XXX | -08:00, +05:30, Z | |
| XXXX | -0800, +0530, Z, +123456 | 2 |
| XXXXX | -08:00, +05:30, Z, +12:34:56 | |
Timezone (ISO-8601 w/o Z) | x | -08, +0530, +00 | |
| xx | -0800, +0530, +0000 | |
| xxx | -08:00, +05:30, +00:00 | 2 |
| xxxx | -0800, +0530, +0000, +123456 | |
| xxxxx | -08:00, +05:30, +00:00, +12:34:56 | |
Timezone (GMT) | O...OOO | GMT-8, GMT+5:30, GMT+0 | |
| OOOO | GMT-08:00, GMT+05:30, GMT+00:00 | 2 |
Timezone (specific non-locat.) | z...zzz | GMT-8, GMT+5:30, GMT+0 | 6 |
| zzzz | GMT-08:00, GMT+05:30, GMT+00:00 | 2,6 |
Seconds timestamp | t | 512969520 | 7 |
| tt | ... | 3,7 |
Milliseconds timestamp | T | 512969520900 | 7 |
| TT | ... | 3,7 |
Long localized date | P | 04/29/1453 | 7 |
| PP | Apr 29, 1453 | 7 |
| PPP | April 29th, 1453 | 7 |
| PPPP | Friday, April 29th, 1453 | 2,7 |
Long localized time | p | 12:00 AM | 7 |
| pp | 12:00:00 AM | 7 |
| ppp | 12:00:00 AM GMT+2 | 7 |
| pppp | 12:00:00 AM GMT+02:00 | 2,7 |
Combination of date and time | Pp | 04/29/1453, 12:00 AM | 7 |
| PPpp | Apr 29, 1453, 12:00:00 AM | 7 |
| PPPppp | April 29th, 1453 at ... | 7 |
| PPPPpppp | Friday, April 29th, 1453 at ... | 2,7 |
Notes:
-
"Formatting" units (e.g. formatting quarter) in the default en-US locale
are the same as "stand-alone" units, but are different in some languages.
"Formatting" units are declined according to the rules of the language
in the context of a date. "Stand-alone" units are always nominative singular:
format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'
format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'
-
Any sequence of the identical letters is a pattern, unless it is escaped by
the single quote characters (see below).
If the sequence is longer than listed in table (e.g. EEEEEEEEEEE
)
the output will be the same as default pattern for this unit, usually
the longest one (in case of ISO weekdays, EEEE
). Default patterns for units
are marked with "2" in the last column of the table.
format(new Date(2017, 10, 6), 'MMM') //=> 'Nov'
format(new Date(2017, 10, 6), 'MMMM') //=> 'November'
format(new Date(2017, 10, 6), 'MMMMM') //=> 'N'
format(new Date(2017, 10, 6), 'MMMMMM') //=> 'November'
format(new Date(2017, 10, 6), 'MMMMMMM') //=> 'November'
-
Some patterns could be unlimited length (such as yyyyyyyy
).
The output will be padded with zeros to match the length of the pattern.
format(new Date(2017, 10, 6), 'yyyyyyyy') //=> '00002017'
-
QQQQQ
and qqqqq
could be not strictly numerical in some locales.
These tokens represent the shortest form of the quarter.
-
The main difference between y
and u
patterns are B.C. years:
Year | y | u |
---|
AC 1 | 1 | 1 |
BC 1 | 1 | 0 |
BC 2 | 2 | -1 |
Also yy
always returns the last two digits of a year,
while uu
pads single digit years to 2 characters and returns other years unchanged:
Year | yy | uu |
---|
1 | 01 | 01 |
14 | 14 | 14 |
376 | 76 | 376 |
1453 | 53 | 1453 |
The same difference is true for local and ISO week-numbering years (Y
and R
),
except local week-numbering years are dependent on options.weekStartsOn
and options.firstWeekContainsDate
(compare getISOWeekYear
and getWeekYear).
-
Specific non-location timezones are currently unavailable in date-fns
,
so right now these tokens fall back to GMT timezones.
-
These patterns are not in the Unicode Technical Standard #35:
i
: ISO day of weekI
: ISO week of yearR
: ISO week-numbering yeart
: seconds timestampT
: milliseconds timestampo
: ordinal number modifierP
: long localized datep
: long localized time
-
YY
and YYYY
tokens represent week-numbering years but they are often confused with years.
You should enable options.useAdditionalWeekYearTokens
to use them. See: unicodeTokens
-
D
and DD
tokens represent days of the year but they are often confused with days of the month.
You should enable options.useAdditionalDayOfYearTokens
to use them. See: unicodeTokens
@typeParam DateType - The Date
type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like UTCDate
.
@param date - The original date
@param format - The string of tokens
@param options - An object with options
@returns The formatted date string
@throws date
must not be Invalid Date
@throws options.locale
must contain localize
property
@throws options.locale
must contain formatLong
property
@throws use yyyy
instead of YYYY
for formatting years using [format provided] to the input [input provided]; see: unicodeTokens
@throws use yy
instead of YY
for formatting years using [format provided] to the input [input provided]; see: unicodeTokens
@throws use d
instead of D
for formatting days of the month using [format provided] to the input [input provided]; see: unicodeTokens
@throws use dd
instead of DD
for formatting days of the month using [format provided] to the input [input provided]; see: unicodeTokens
@throws format string contains an unescaped latin alphabet character
@example
// Represent 11 February 2014 in middle-endian format:
const result = format(new Date(2014, 1, 11), 'MM/dd/yyyy')
//=> '02/11/2014'
@example
// Represent 2 July 2014 in Esperanto:
import { eoLocale } from 'date-fns/locale/eo'
const result = format(new Date(2014, 6, 2), "do 'de' MMMM yyyy", {
locale: eoLocale
})
//=> '2-a de julio 2014'
@example
const result = format(new Date(2014, 6, 2, 15), "h 'o''clock'")
License
Specify your project's license here, if applicable.
Deployment
Include additional sections if necessary, detailing deployment processes, additional configurations, or contributions guidelines, depending on the complexity and usage of your project.