[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-3397":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":16,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":23,"topics":24,"createdAt":10,"pushedAt":10,"updatedAt":32,"readmeContent":33,"aiSummary":34,"trendingCount":16,"starSnapshotCount":16,"syncStatus":18,"lastSyncTime":35,"discoverSource":36},3397,"You-Dont-Need-Momentjs","you-dont-need\u002FYou-Dont-Need-Momentjs","you-dont-need","List of functions which you can use to replace moment.js + ESLint Plugin","",null,"JavaScript",13300,310,133,26,0,1,2,42.48,"MIT License",false,"master",true,[25,26,27,28,29,30,31],"bundle-size","date-fns","esmodules","hacktoberfest","moment-js","pure-function","tree-shaking","2026-06-12 02:00:49","# [You don't (may not) need Moment.js](https:\u002F\u002Fyou-dont-need.github.io\u002FYou-Dont-Need-Momentjs\u002F#\u002F)\n\n[![Join the community on Spectrum](https:\u002F\u002Fwithspectrum.github.io\u002Fbadge\u002Fbadge.svg)](https:\u002F\u002Fdev.to\u002Ft\u002Fmomentjs)\n\n[Moment.js](https:\u002F\u002Fmomentjs.com\u002F) is a fantastic time & date library with lots of great features and utilities. However, if you are working on a performance sensitive web application, it might cause a huge performance overhead because of its complex APIs and large bundle size.\n\n![Large bundle size](.\u002Fscreenshot.png)\n\nProblems with Moment.js:\n\n- It is highly based on OOP APIs, which makes it fail to work with tree-shaking, thus leading to a huge bundle size and performance issues.\n- It is mutable and it causes bugs:\n  - [clone](https:\u002F\u002Fmomentjs.com\u002Fdocs\u002F#\u002Fparsing\u002Fmoment-clone\u002F)\n  - [How do I work around mutability in moment.js?](https:\u002F\u002Fstackoverflow.com\u002Fquestions\u002F30979178\u002Fhow-do-i-work-around-mutability-in-moment-js)\n- Complex OOP API (which doubles mutability problem). Here is an example:\n  https:\u002F\u002Fgithub.com\u002Fmoment\u002Fmoment\u002Fblob\u002Fdevelop\u002Fsrc\u002Ftest\u002Fmoment\u002Fadd_subtract.js#L244-L286\n  Moment.js allows to use `a.subtract('ms', 50)`, `a.subtract(50, 'ms')` and even `a.subtract('s', '50')`.\n\nIf you are not using timezone but only a few simple functions from moment.js, this might bloat your app, and therefore is considered overkill. [dayjs](https:\u002F\u002Fgithub.com\u002Fiamkun\u002Fdayjs) has a smaller core and has very similar APIs so it makes it very easy to migrate. [date-fns](https:\u002F\u002Fgithub.com\u002Fdate-fns\u002Fdate-fns) enables [tree-shaking and other benefits](https:\u002F\u002Fgithub.com\u002Fdate-fns\u002Fdate-fns\u002Fissues\u002F275#issuecomment-264934189) so that it works great with React, Sinon.js, and webpack, etc. See https:\u002F\u002Fgithub.com\u002Fmoment\u002Fmoment\u002Fissues\u002F2373 for more ideas on why and how people switch from moment.js to other solutions.\n\n## Brief Comparison\n\n| Name      | Tree-shaking | Methods richness | Pattern    | Locale | Timezone Support       | Popularity (stars)                                               | Sizes                                                                                                                        |\n| --------- | ------------ | ---------------- | ---------- | ------ | ---------------------- | ---------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |\n| Moment.js | No           | High             | OO         | 123    | Good (moment-timezone) | ![stars](https:\u002F\u002Fflat.badgen.net\u002Fgithub\u002Fstars\u002Fmoment\u002Fmoment)     | ![raw](https:\u002F\u002Fflat.badgen.net\u002Fbundlephobia\u002Fmin\u002Fmoment?label=min) ![size](https:\u002F\u002Fflat.badgen.net\u002Fbundlephobia\u002Fminzip\u002Fmoment?label=zip&color=purple)     |\n| Luxon     | No           | High             | OO         | -      | Good (Intl)            | ![stars](https:\u002F\u002Fflat.badgen.net\u002Fgithub\u002Fstars\u002Fmoment\u002Fluxon)      | ![raw](https:\u002F\u002Fflat.badgen.net\u002Fbundlephobia\u002Fmin\u002Fluxon?label=min) ![size](https:\u002F\u002Fflat.badgen.net\u002Fbundlephobia\u002Fminzip\u002Fluxon?label=zip&color=purple)       |\n| date-fns  | Yes          | High             | Functional | 64     | Good (date-fns-tz)     | ![stars](https:\u002F\u002Fflat.badgen.net\u002Fgithub\u002Fstars\u002Fdate-fns\u002Fdate-fns) | ![raw](https:\u002F\u002Fflat.badgen.net\u002Fbundlephobia\u002Fmin\u002Fdate-fns?label=min) ![size](https:\u002F\u002Fflat.badgen.net\u002Fbundlephobia\u002Fminzip\u002Fdate-fns?label=zip&color=purple) |\n| dayjs     | No           | High             | OO         | 138    | Good (Intl)            | ![stars](https:\u002F\u002Fflat.badgen.net\u002Fgithub\u002Fstars\u002Fiamkun\u002Fdayjs)      | ![raw](https:\u002F\u002Fflat.badgen.net\u002Fbundlephobia\u002Fmin\u002Fdayjs?label=min) ![size](https:\u002F\u002Fflat.badgen.net\u002Fbundlephobia\u002Fminzip\u002Fdayjs?label=zip&color=purple)       |\n\n## Voice of Developers\n\n> [Removed moment.js to replace with date-fns - build output reduced by 40%](https:\u002F\u002Fgithub.com\u002Foysterprotocol\u002Fwebnode\u002Fpull\u002F116)\n\n> &mdash;\u003Ccite>Jared Farago from [webnode](https:\u002F\u002Fgithub.com\u002Foysterprotocol\u002Fwebnode\u002Fpull\u002F116) project.\u003C\u002Fcite>\n\n> [Good library if you’re looking to replace Moment.js for one reason or another. Immutable too.](https:\u002F\u002Ftwitter.com\u002Fdan_abramov\u002Fstatus\u002F805030922785525760)\n\n> &mdash;\u003Ccite>Dan Abramov, Author of [Redux](https:\u002F\u002Fgithub.com\u002Freduxjs\u002Fredux) and co-author of [Create React App](https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fcreate-react-app). Building tools for humans.\u003C\u002Fcite>\n\n> [I strongly recommend using date-fns over Moment.js, it's has a nicer API and you can include only parts you need!](https:\u002F\u002Ftwitter.com\u002Fsilvenon\u002Fstatus\u002F804946772690923520)\n\n> &mdash;\u003Ccite>Matija Marohnić, a design-savvy frontend developer from Croatia.\u003C\u002Fcite>\n\n## ESLint Plugin\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Feslint-plugin-you-dont-need-momentjs\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fv\u002Feslint-plugin-you-dont-need-momentjs.svg?style=flat-square\"\n      alt=\"NPM Version\">\n  \u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fwww.npmjs.org\u002Fpackage\u002Feslint-plugin-you-dont-need-momentjs\">\n    \u003Cimg src=\"http:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fdm\u002Feslint-plugin-you-dont-need-momentjs.svg?style=flat-square?style=flat-square\"\n      alt=\"Downloads\">\n  \u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Ftravis-ci.org\u002Fyou-dont-need\u002FYou-Dont-Need-Momentjs\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Ftravis\u002Fyou-dont-need\u002FYou-Dont-Need-Momentjs\u002Fmaster.svg?style=flat-square\"\n      alt=\"Build Status\">\n  \u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fcoveralls.io\u002Fgithub\u002Fyou-dont-need\u002FYou-Dont-Need-Momentjs?branch=master\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fcoveralls\u002Fyou-dont-need\u002FYou-Dont-Need-Momentjs\u002Fmaster.svg?style=flat-square\"\n      alt=\"Coverage Status\" \u002F>\n  \u003C\u002Fa>\n\u003C\u002Fp>\n\nIf you're using [ESLint](http:\u002F\u002Feslint.org\u002F), you can install a\n[plugin](http:\u002F\u002Feslint.org\u002Fdocs\u002Fuser-guide\u002Fconfiguring#using-the-configuration-from-a-plugin) that\nwill help you identify places in your codebase where you don't (may not) need Moment.js.\n\nInstall the plugin...\n\n```sh\nnpm install --save-dev eslint-plugin-you-dont-need-momentjs\n```\n\n...then update your config\n\n```js\n\"extends\" : [\"plugin:you-dont-need-momentjs\u002Frecommended\"],\n```\n\n## Quick Links\n\n**[Parse](#parse)**\n\n1. [String + Date Format](#string--date-format)\n1. [String + Time Format](#string--time-format)\n1. [String + Format + locale](#string--format--locale)\n\n**[Get + Set](#get--set)**\n\n1. [Millisecond\u002FSecond\u002FMinute\u002FHour](#millisecond--second--minute--hour)\n1. [Date of Month](#date-of-month)\n1. [Day of Week](#day-of-week)\n1. [Day of Year](#day-of-year)\n1. [Week of Year](#week-of-year)\n1. [Days in Month](#days-in-month)\n1. [Weeks in Year](#weeks-in-year)\n1. [Maximum of the given dates](#maximum-of-the-given-dates)\n1. [Minimum of the given dates](#minimum-of-the-given-dates)\n\n**[Manipulate](#manipulate)**\n\n1. [Add](#add)\n1. [Subtract](#subtract)\n1. [Start of Time](#start-of-time)\n1. [End of Time](#end-of-time)\n\n**[Display](#display)**\n\n1. [Format](#format)\n1. [Time from now](#time-from-now)\n1. [Time from X](#time-from-x)\n1. [Difference](#difference)\n\n**[Query](#query)**\n\n1. [Is Before](#is-before)\n1. [Is Same](#is-same)\n1. [Is After](#is-after)\n1. [Is Between](#is-between)\n1. [Is Leap Year](#is-leap-year)\n1. [Is a Date](#is-a-date)\n\n# Feature Parity\n\n⚠️ Indicates other packages or work are needed. See individual functions [above](#quick-links).\n\n|                                | Native | Luxon | date-fns | dayjs | Temporal |\n| ------------------------------ | ------ | ----- | -------- | ----- | -------- |\n| **Parse**                      |        |       |          |       |          |\n| String + Date Format           | ✅     | ✅     | ✅       | ✅    | ✅         |\n| String + Time Format           | ✅     | ✅     | ✅       | ⚠️    | ✅        |\n| String + Format + locale       | ❌     | ⚠️     | ✅       | ⚠️    | ❌        |\n|                                |        |       |          |       |          |\n| **Get + Set**                  |        |       |          |       |          |\n| Millisecond\u002FSecond\u002FMinute\u002FHour | ✅     | ✅    | ✅       | ✅    | ✅        |\n| Date of Month                  | ✅     | ✅    | ✅       | ✅    | ✅        |\n| Day of Week                    | ✅     | ✅    | ✅       | ✅    | ✅        |\n| Day of Year                    | ✅     | ✅    | ✅       | ✅    | ✅        |\n| Week of Year                   | ✅     | ✅    | ✅       | ⚠️    | ✅        |\n| Days in Month                  | ✅     | ✅    | ✅       | ✅    | ✅        |\n| Weeks in Year                  | ❌     | ❌    | ✅       | ⚠️    | ✅        |\n| Maximum of the given dates     | ✅     | ✅    | ✅       | ⚠️    | ✅        |\n| Minimum of the given dates     | ✅     | ✅    | ✅       | ⚠️    | ✅        |\n|                                |        |       |          |       |          |\n| **Manipulate**                 |        |       |          |       |          |\n| Add                            | ✅     | ✅    | ✅       | ✅    | ✅        |\n| Subtract                       | ✅     | ✅    | ✅       | ✅    | ✅        |\n| Start of Time                  | ❌     | ✅    | ✅       | ✅    | ✅        |\n| End of Time                    | ✅     | ✅    | ✅       | ✅    | ✅        |\n|                                |        |       |          |       |          |\n| **Display**                    |        |       |          |       |          |\n| Format                         | ✅     | ✅    | ✅       | ✅    | ✅        |\n| Time from now                  | ✅     | ❌    | ✅       | ⚠️    | ✅        |\n| Time from X                    | ❌     | ❌    | ✅       | ⚠️    | ✅        |\n| Difference                     | ✅     | ✅    | ✅       | ✅    | ✅        |\n|                                |        |       |          |       |          |\n| **Query**                      |        |       |          |       |          |\n| Is Before                      | ✅     | ✅    | ✅       | ✅    | ✅        |\n| Is Same                        | ✅     | ✅    | ✅       | ✅    | ✅        |\n| Is After                       | ✅     | ✅    | ✅       | ✅    | ✅        |\n| Is Between                     | ❌     | ✅    | ✅       | ⚠️    | ❌        |\n| Is Leap Year                   | ✅     | ✅    | ✅       | ⚠️    | ✅        |\n| Is a Date                      | ✅     | ✅    | ✅       | ✅    | ✅        |\n\n## Parse\n\n### String + Date Format\n\nReturn the date parsed from date string using the given format string.\n\n```js\n\u002F\u002F Moment.js\nmoment('12-25-1995', 'MM-DD-YYYY');\n\u002F\u002F => \"1995-12-24T13:00:00.000Z\"\n\n\u002F\u002F Native\nconst datePattern = \u002F^(\\d{2})-(\\d{2})-(\\d{4})$\u002F;\nconst [, month, day, year] = datePattern.exec('12-25-1995');\nnew Date(`${month}, ${day} ${year}`);\n\u002F\u002F => \"1995-12-24T13:00:00.000Z\"\n\n\u002F\u002F date-fns\nimport parse from 'date-fns\u002Fparse';\nparse('12-25-1995', 'MM-dd-yyyy', new Date());\n\u002F\u002F => \"1995-12-24T13:00:00.000Z\"\n\n\u002F\u002F dayjs\ndayjs('12-25-1995');\n\u002F\u002F => \"1995-12-24T13:00:00.000Z\"\n\n\u002F\u002F luxon\nDateTime.fromFormat('12-25-1995', 'MM-dd-yyyy').toJSDate();\n\u002F\u002F => \"1995-12-24T13:00:00.000Z\"\n\n\u002F\u002F Temporal\nconst datePattern = \u002F^(\\d{2})-(\\d{2})-(\\d{4})$\u002F;\nconst [, month, day, year] = datePattern.exec('12-25-1995');\nnew Temporal.ZonedDateTime.from({year, month, day, timeZone: Temporal.Now.timeZone()});\n\u002F\u002F => \"1995-12-24T13:00:00.000Z\"\n```\n\n**[⬆ back to top](#quick-links)**\n\n### String + Time Format\n\nReturn the date parsed from time string using the given format string.\n\n```js\n\u002F\u002F Moment.js\nmoment('2010-10-20 4:30', 'YYYY-MM-DD HH:mm');\n\u002F\u002F => \"2010-10-19T17:30:00.000Z\"\n\n\u002F\u002F Native\nconst datePattern = \u002F^(\\d{4})-(\\d{2})-(\\d{2})\\s(\\d{1,2}):(\\d{2})$\u002F;\nconst [, year, month, day, rawHour, min] = datePattern.exec('2010-10-20 4:30');\nnew Date(`${year}-${month}-${day}T${('0' + rawHour).slice(-2)}:${min}:00`);\n\u002F\u002F => \"2010-10-19T17:30:00.000Z\"\n\n\u002F\u002F date-fns\nimport parse from 'date-fns\u002Fparse';\nparse('2010-10-20 4:30', 'yyyy-MM-dd H:mm', new Date());\n\u002F\u002F => \"2010-10-19T17:30:00.000Z\"\n\n\u002F\u002F dayjs ⚠️ requires customParseFormat plugin\nimport customParseFormat from 'dayjs\u002Fplugin\u002FcustomParseFormat';\ndayjs.extend(customParseFormat);\ndayjs('2010-10-20 4:30', 'YYYY-MM-DD HH:mm');\n\u002F\u002F => \"2010-10-19T17:30:00.000Z\"\n\n\u002F\u002F luxon\nDateTime.fromFormat('2010-10-20 4:30', 'yyyy-MM-dd H:mm').toJSDate();\n\u002F\u002F => \"2010-10-19T17:30:00.000Z\"\n\n\u002F\u002F Temporal\nconst datePattern = \u002F^(\\d{4})-(\\d{2})-(\\d{2})\\s(\\d{1,2}):(\\d{2})$\u002F;\nconst [, year, month, day, hour, minute] = datePattern.exec('2010-10-20 4:30');\nnew Temporal.ZonedDateTime.from({year, month, day, hour, minute, timeZone: Temporal.Now.timeZone()});\n\u002F\u002F => \"2010-10-19T17:30:00.000Z\"\n```\n\n**[⬆ back to top](#quick-links)**\n\n### String + Format + locale\n\nReturn the date parsed from string using the given format string and locale.\n\n```js\n\u002F\u002F Moment.js\nmoment('2012 mars', 'YYYY MMM', 'fr');\n\u002F\u002F => \"2012-02-29T13:00:00.000Z\"\n\n\u002F\u002F date-fns\nimport parse from 'date-fns\u002Fparse';\nimport fr from 'date-fns\u002Flocale\u002Ffr';\nparse('2012 mars', 'yyyy MMMM', new Date(), { locale: fr });\n\u002F\u002F => \"2012-02-29T13:00:00.000Z\"\n\n\u002F\u002F dayjs ⚠️ requires customParseFormat plugin\nimport customParseFormat from 'dayjs\u002Fplugin\u002FcustomParseFormat';\nimport 'dayjs\u002Flocale\u002Ffr';\ndayjs.extend(customParseFormat);\ndayjs('2012 mars', 'YYYY MMM', 'fr');\n\u002F\u002F => \"2012-02-29T13:00:00.000Z\"\n\n\u002F\u002F Luxon ❌ does not support Locale for node unless https:\u002F\u002Fmoment.github.io\u002Fluxon\u002Fdocs\u002Fmanual\u002Finstall.html#node\nDateTime.fromFormat('2012 mars', 'yyyy MMMM', { locale: 'fr' });\n\u002F\u002F => \"2012-02-29T13:00:00.000Z\"\n```\n\n**[⬆ back to top](#quick-links)**\n\n## Get + Set\n\n### Millisecond \u002F Second \u002F Minute \u002F Hour\n\nGet the `Millisecond\u002FSecond\u002FMinute\u002FHour` of the given date.\n\n```js\n\u002F\u002F Moment.js\nmoment().seconds();\n\u002F\u002F => 49\nmoment().hours();\n\u002F\u002F => 19\n\n\u002F\u002F Native\nnew Date().getSeconds();\n\u002F\u002F => 49\nnew Date().getHours();\n\u002F\u002F => 19\n\n\u002F\u002F date-fns\nimport getSeconds from 'date-fns\u002FgetSeconds';\nimport getHours from 'date-fns\u002FgetHours';\ngetSeconds(new Date());\n\u002F\u002F => 49\ngetHours(new Date());\n\u002F\u002F => 19\n\n\u002F\u002F dayjs\ndayjs().second();\n\u002F\u002F => 49\ndayjs().hour();\n\u002F\u002F => 19\n\n\u002F\u002F Luxon\nDateTime.local().second;\n\u002F\u002F => 49\nDateTime.local().hour;\n\u002F\u002F => 19\n\n\u002F\u002F Temporal\nTemporal.Now.zonedDateTimeISO().second;\n\u002F\u002F => 49\nTemporal.Now.zonedDateTimeISO().hour;\n\u002F\u002F => 19\n```\n\n### Performance tests\n\n| Library  | Time       |\n| -------- | ---------- |\n| Moment   | 1500.703ms |\n| Native   | 348.411ms  |\n| DateFns  | 520.670ms  |\n| DayJs    | 494.234ms  |\n| Luxon    | 1208.368ms |\n| Temporal | -          |\n\nSet the `Millisecond\u002FSecond\u002FMinute\u002FHour` of the given date.\n\n```js\n\u002F\u002F Moment.js\nmoment().seconds(30);\n\u002F\u002F => \"2018-09-09T09:12:30.695Z\"\nmoment().hours(13);\n\u002F\u002F => \"2018-09-09T03:12:49.695Z\"\n\n\u002F\u002F Native\nnew Date(new Date().setSeconds(30));\n\u002F\u002F => \"2018-09-09T09:12:30.695Z\"\nnew Date(new Date().setHours(13));\n\u002F\u002F => \"2018-09-09T03:12:49.695Z\"\n\n\u002F\u002F date-fns\nimport setSeconds from 'date-fns\u002FsetSeconds';\nimport setHours from 'date-fns\u002FsetHours';\nsetSeconds(new Date(), 30);\n\u002F\u002F => \"2018-09-09T09:12:30.695Z\"\nsetHours(new Date(), 13);\n\u002F\u002F => \"2018-09-09T03:12:49.695Z\"\n\n\u002F\u002F dayjs\ndayjs().set('second', 30);\n\u002F\u002F => \"2018-09-09T09:12:30.695Z\"\ndayjs().set('hour', 13);\n\u002F\u002F => \"2018-09-09T03:12:49.695Z\"\n\n\u002F\u002F luxon\nDateTime.utc()\n  .set({ second: 30 })\n  .toJSDate();\n\u002F\u002F => \"2018-09-09T09:12:30.695Z\"\nDateTime.utc()\n  .set({ hour: 13 })\n  .toJSDate();\n\u002F\u002F => \"2018-09-09T03:12:49.695Z\"\n\n\u002F\u002F Temporal\nTemporal.Now.zonedDateTimeISO().with({ second: 30 });\n\u002F\u002F => \"2018-09-09T09:12:30.695Z\"\nTemporal.Now.zonedDateTimeISO().with({ hour: 13 });\n\u002F\u002F => \"2018-09-09T03:12:49.695Z\"\n```\n\n### Performance tests\n\n| Library  | Time       |\n| -------- | ---------- |\n| Moment   | 1689.744ms |\n| Native   | 636.741ms  |\n| DateFns  | 714.148ms  |\n| DayJs    | 2037.603ms |\n| Luxon    | 2897.571ms |\n| Temporal | -          |\n\n**[⬆ back to top](#quick-links)**\n\n### Date of Month\n\nGets or sets the day of the month.\n\n```js\n\u002F\u002F Moment.js\nmoment().date();\n\u002F\u002F => 9\nmoment().date(4);\n\u002F\u002F => \"2018-09-04T09:12:49.695Z\"\n\n\u002F\u002F Native\nnew Date().getDate();\n\u002F\u002F => 9\nnew Date().setDate(4);\n\u002F\u002F => \"2018-09-04T09:12:49.695Z\"\n\n\u002F\u002F date-fns\nimport getDate from 'date-fns\u002FgetDate';\nimport setDate from 'date-fns\u002FsetDate';\ngetDate(new Date());\n\u002F\u002F => 9\nsetDate(new Date(), 4);\n\u002F\u002F => \"2018-09-04T09:12:49.695Z\"\n\n\u002F\u002F dayjs\ndayjs().date();\n\u002F\u002F => 9\ndayjs().set('date', 4);\n\u002F\u002F => \"2018-09-04T09:12:49.695Z\"\n\n\u002F\u002F luxon\nDateTime.utc().day;\n\u002F\u002F => 9\nDateTime.utc()\n  .set({ day: 4 })\n  .toString();\n\u002F\u002F => \"2018-09-04T09:12:49.695Z\"\n\n\u002F\u002F Temporal\nTemporal.Now.zonedDateTimeISO().day;\n\u002F\u002F => 9\nTemporal.Now.zonedDateTimeISO().with({ day: 4 });\n\u002F\u002F => \"2018-09-04T09:12:49.695Z\"\n```\n\n### Performance tests\n\n| Library  | Time       |\n| -------- | ---------- |\n| Moment   | 1381.669ms |\n| Native   | 397.415ms  |\n| DateFns  | 588.004ms  |\n| DayJs    | 1218.025ms |\n| Luxon    | 2705.606ms |\n| Temporal | -          |\n\n**[⬆ back to top](#quick-links)**\n\n### Day of Week\n\nGets or sets the day of the week.\n\n```js\n\u002F\u002F Moment.js\nmoment().day();\n\u002F\u002F => 0 (Sunday)\nmoment().day(-14);\n\u002F\u002F => \"2018-08-26T09:12:49.695Z\"\n\n\u002F\u002F Native\nnew Date().getDay();\n\u002F\u002F => 0 (Sunday)\nnew Date().setDate(new Date().getDate() - 14);\n\u002F\u002F => \"2018-08-26T09:12:49.695Z\"\n\n\u002F\u002F date-fns\nimport getDay from 'date-fns\u002FgetDay';\nimport setDay from 'date-fns\u002FsetDay';\ngetDay(new Date());\n\u002F\u002F => 0 (Sunday)\nsetDay(new Date(), -14);\n\u002F\u002F => \"2018-08-26T09:12:49.695Z\"\n\n\u002F\u002F dayjs\ndayjs().day();\n\u002F\u002F => 0 (Sunday)\ndayjs().set('day', -14);\n\u002F\u002F => \"2018-08-26T09:12:49.695Z\"\n\n\u002F\u002F Luxon\nDateTime.local().weekday;\n\u002F\u002F => 7 (Sunday)\nDateTime.local()\n  .minus({ day: 14 })\n  .toJSDate();\n\u002F\u002F => \"2018-08-26T09:12:49.695Z\"\n\n\u002F\u002F Temporal\nTemporal.Now.zonedDateTimeISO().dayOfWeek;\n\u002F\u002F => 7 (Sunday)\nTemporal.Now.zonedDateTimeISO().subtract(Temporal.Duration.from({ days: 14 }));\n\u002F\u002F => \"2018-09-04T09:12:49.695Z\"\n```\n\n| Library  | Time       |\n| -------- | ---------- |\n| Moment   | 1919.404ms |\n| Native   | 543.466ms  |\n| DateFns  | 841.436ms  |\n| DayJs    | 1229.475ms |\n| Luxon    | 3936.282ms |\n| Temporal | -          |\n\n**[⬆ back to top](#quick-links)**\n\n### Day of Year\n\nGets or sets the day of the year.\n\n```js\n\u002F\u002F Moment.js\nmoment().dayOfYear();\n\u002F\u002F => 252\nmoment().dayOfYear(256);\n\u002F\u002F => \"2018-09-13T09:12:49.695Z\"\n\n\u002F\u002F Native\nMath.floor(\n  (new Date() - new Date(new Date().getFullYear(), 0, 0)) \u002F 1000 \u002F 60 \u002F 60 \u002F 24\n);\n\u002F\u002F => 252\n\n\u002F\u002F date-fns\nimport getDayOfYear from 'date-fns\u002FgetDayOfYear';\nimport setDayOfYear from 'date-fns\u002FsetDayOfYear';\ngetDayOfYear(new Date());\n\u002F\u002F => 252\nsetDayOfYear(new Date(), 256);\n\u002F\u002F => \"2018-09-13T09:12:49.695Z\"\n\n\u002F\u002F dayjs ⚠️ requires dayOfYear plugin\nimport dayOfYear from 'dayjs\u002Fplugin\u002FdayOfYear';\ndayjs.extend(dayOfYear);\ndayjs().dayOfYear();\n\u002F\u002F => 252\ndayjs().dayOfYear(256);\n\u002F\u002F => \"2018-09-13T09:12:49.695Z\"\n\n\u002F\u002F Luxon\nDateTime.local().ordinal;\n\u002F\u002F => 252\nDateTime.local()\n  .set({ ordinal: 256 })\n  .toString();\n\u002F\u002F => \"2018-09-13T09:12:49.695Z\"\n\n\u002F\u002F Temporal\nTemporal.Now.zonedDateTimeISO().dayOfYear;\n\u002F\u002F => 252\nTemporal.Now.zonedDateTimeISO().with({month: 1, day: 1}).add(Temporal.Duration.from({days: 256}));\n\u002F\u002F => \"2018-09-04T09:12:49.695Z\"\n```\n\n| Library  | Time       |\n| -------- | ---------- |\n| Moment   | 5511.172ms |\n| Native   | 530.592ms  |\n| DateFns  | 2079.043ms |\n| DayJs    | -          |\n| Luxon    | 3540.810ms |\n| Temporal | -          |\n\n**[⬆ back to top](#quick-links)**\n\n### Week of Year\n\nGets or sets the week of the year.\n\n```js\n\u002F\u002F Moment.js\nmoment().week();\n\u002F\u002F => 37\nmoment().week(24);\n\u002F\u002F => \"2018-06-10T09:12:49.695Z\"\n\n\u002F\u002F date-fns\nimport getWeek from 'date-fns\u002FgetWeek';\nimport setWeek from 'date-fns\u002FsetWeek';\ngetWeek(new Date());\n\u002F\u002F => 37\nsetWeek(new Date(), 24);\n\u002F\u002F => \"2018-06-10T09:12:49.695Z\"\n\n\u002F\u002F native getWeek\nconst day = new Date();\nconst MILLISECONDS_IN_WEEK = 604800000;\nconst firstDayOfWeek = 1; \u002F\u002F monday as the first day (0 = sunday)\nconst startOfYear = new Date(day.getFullYear(), 0, 1);\nstartOfYear.setDate(\n  startOfYear.getDate() + (firstDayOfWeek - (startOfYear.getDay() % 7))\n);\nconst dayWeek = Math.round((day - startOfYear) \u002F MILLISECONDS_IN_WEEK) + 1;\n\u002F\u002F => 37\n\n\u002F\u002F native setWeek\nconst day = new Date();\nconst week = 24;\nconst MILLISECONDS_IN_WEEK = 604800000;\nconst firstDayOfWeek = 1; \u002F\u002F monday as the first day (0 = sunday)\nconst startOfYear = new Date(day.getFullYear(), 0, 1);\nstartOfYear.setDate(\n  startOfYear.getDate() + (firstDayOfWeek - (startOfYear.getDay() % 7))\n);\nconst dayWeek = Math.round((day - startOfYear) \u002F MILLISECONDS_IN_WEEK) + 1;\nday.setDate(day.getDate() - (dayWeek - week) * 7);\nday.toISOString();\n\u002F\u002F => \"2018-06-10T09:12:49.794Z\n\n\u002F\u002F dayjs ⚠️ requires weekOfYear plugin\nimport weekOfYear from 'dayjs\u002Fplugin\u002FweekOfYear';\ndayjs.extend(weekOfYear);\ndayjs().week();\n\u002F\u002F => 37\ndayjs().week(24);\n\u002F\u002F => \"2018-06-10T09:12:49.695Z\"\n\n\u002F\u002F Luxon\nDateTime.local().weekNumber;\n\u002F\u002F => 37\nDateTime.local()\n  .set({ weekNumber: 23 })\n  .toString();\n\u002F\u002F => \"2018-06-10T09:12:49.794Z\n\n\u002F\u002F Temporal\nTemporal.Now.zonedDateTimeISO().weekOfYear;\n\u002F\u002F => 252\nTemporal.Now.zonedDateTimeISO().with({month: 1, day: 1}).add(Temporal.Duration.from({weeks: 23}));\n\u002F\u002F => \"2018-09-04T09:12:49.695Z\"\n```\n\n| Library  | Time       |\n| -------- | ---------- |\n| Moment   | 7147.201ms |\n| Native   | 1371.631ms |\n| DateFns  | 5834.815ms |\n| DayJs    | -          |\n| Luxon    | 4514.771ms |\n| Temporal | -          |\n\n**[⬆ back to top](#quick-links)**\n\n### Days in Month\n\nGet the number of days in the current month.\n\n```js\n\u002F\u002F Moment.js\nmoment('2012-02', 'YYYY-MM').daysInMonth();\n\u002F\u002F => 29\n\n\u002F\u002F Native\nnew Date(2012, 02, 0).getDate();\n\u002F\u002F => 29\n\n\u002F\u002F date-fns\nimport getDaysInMonth from 'date-fns\u002FgetDaysInMonth';\ngetDaysInMonth(new Date(2012, 1));\n\u002F\u002F => 29\n\n\u002F\u002F dayjs\ndayjs('2012-02').daysInMonth();\n\u002F\u002F => 29\n\n\u002F\u002F Luxon\nDateTime.local(2012, 2).daysInMonth;\n\u002F\u002F => 29\n\n\u002F\u002F Temporal\n(new Temporal.PlainYearMonth(2012, 2)).daysInMonth\n\u002F\u002F or\nTemporal.PlainYearMonth.from('2012-02').daysInMonth\n\u002F\u002F => 29\n```\n\n| Library  | Time       |\n| -------- | ---------- |\n| Moment   | 4415.065ms |\n| Native   | 186.196ms  |\n| DateFns  | 634.084ms  |\n| DayJs    | 1922.774ms |\n| Luxon    | 1403.032ms |\n| Temporal | -          |\n\n**[⬆ back to top](#quick-links)**\n\n### Weeks in Year\n\nGets the number of weeks in the current year, according to ISO weeks.\n\n```js\n\u002F\u002F Moment.js\nmoment().isoWeeksInYear();\n\u002F\u002F => 52\n\n\u002F\u002F Native\nconst year = new Date().getFullYear();\nconst MILLISECONDS_IN_WEEK = 604800000;\nconst firstMondayThisYear = new Date(+year,   0, 5-(new Date(+year,   0, 4).getDay()||7));\nconst firstMondayNextYear = new Date(+year+1, 0, 5-(new Date(+year+1, 0, 4).getDay()||7));\n(firstMondayNextYear - firstMondayThisYear) \u002F MILLISECONDS_IN_WEEK;\n\u002F\u002F => 52\n\n\u002F\u002F date-fns\nimport getISOWeeksInYear from 'date-fns\u002FgetISOWeeksInYear';\ngetISOWeeksInYear(new Date());\n\u002F\u002F => 52\n\n\u002F\u002F dayjs ⚠️ requires isoWeeksInYear plugin\nimport isoWeeksInYear from 'dayjs\u002Fplugin\u002FisoWeeksInYear';\ndayjs.extend(isoWeeksInYear);\ndayjs().isoWeeksInYear();\n\u002F\u002F => 52\n\n\u002F\u002F Luxon\nDateTime.local().weeksInWeekYear;\n\u002F\u002F => 52\n\n\u002F\u002F Temporal\nTemporal.PlainDate.from({day:31, month:12, year: Temporal.Now.plainDateISO()}).weekOfYear\n\u002F\u002F => 52\n```\n\n| Library  | Time       |\n| -------- | ---------- |\n| Moment   | 1065.247ms |\n| Native   | -          |\n| DateFns  | 4954.042ms |\n| DayJs    | -          |\n| Luxon    | 1134.483ms |\n| Temporal | -          |\n\n**[⬆ back to top](#quick-links)**\n\n### Maximum of the given dates\n\nReturns the maximum (most distant future) of the given date.\n\n```js\nconst array = [\n  new Date(2017, 4, 13),\n  new Date(2018, 2, 12),\n  new Date(2016, 0, 10),\n  new Date(2016, 0, 9),\n];\n\u002F\u002F Moment.js\nmoment.max(array.map(a => moment(a)));\n\u002F\u002F => \"2018-03-11T13:00:00.000Z\"\n\n\u002F\u002F Native\nnew Date(Math.max.apply(null, array)).toISOString();\n\u002F\u002F => \"2018-03-11T13:00:00.000Z\"\n\n\u002F\u002F date-fns\nimport max from 'date-fns\u002Fmax';\nmax(array);\n\u002F\u002F => \"2018-03-11T13:00:00.000Z\"\n\n\u002F\u002F dayjs ⚠️ requires minMax plugin\nimport minMax from 'dayjs\u002Fplugin\u002FminMax';\ndayjs.extend(minMax);\ndayjs.max(array.map(a => dayjs(a)));\n\u002F\u002F => \"2018-03-11T13:00:00.000Z\"\n\n\u002F\u002F Luxon\nDateTime.max(...array.map(a => DateTime.fromJSDate(a))).toJSDate();\n\u002F\u002F => \"2018-03-11T13:00:00.000Z\"\n\n\u002F\u002F Temporal\nTemporal.Instant.fromEpochMilliseconds(Math.max.apply(null, array))\n\u002F\u002F => \"2018-03-11T13:00:00.000Z\"\n```\n\n| Library  | Time       |\n| -------- | ---------- |\n| Moment   | 1780.075ms |\n| Native   | 828.332ms  |\n| DateFns  | 980.938ms  |\n| DayJs    | -          |\n| Luxon    | 2694.702ms |\n| Temporal | -          |\n\n**[⬆ back to top](#quick-links)**\n\n### Minimum of the given dates\n\nReturns the minimum (most distant future) of the given date.\n\n```js\nconst array = [\n  new Date(2017, 4, 13),\n  new Date(2018, 2, 12),\n  new Date(2016, 0, 10),\n  new Date(2016, 0, 9),\n];\n\u002F\u002F Moment.js\nmoment.min(array.map(a => moment(a)));\n\u002F\u002F => \"2016-01-08T13:00:00.000Z\"\n\n\u002F\u002F Native\nnew Date(Math.min.apply(null, array)).toISOString();\n\u002F\u002F => \"2016-01-08T13:00:00.000Z\"\n\n\u002F\u002F date-fns\nimport min from 'date-fns\u002Fmin';\nmin(array);\n\u002F\u002F => \"2016-01-08T13:00:00.000Z\"\n\n\u002F\u002F dayjs ⚠️ requires minMax plugin\nimport minMax from 'dayjs\u002Fplugin\u002FminMax';\ndayjs.extend(minMax);\ndayjs.min(array.map(a => dayjs(a)));\n\u002F\u002F => \"2016-01-08T13:00:00.000Z\"\n\n\u002F\u002F Luxon\nDateTime.min(...array.map(a => DateTime.fromJSDate(a))).toJSDate();\n\u002F\u002F => \"2016-01-08T13:00:00.000Z\"\n\n\u002F\u002F Temporal\nTemporal.Instant.fromEpochMilliseconds(Math.min.apply(null, array))\n\u002F\u002F => \"2018-03-11T13:00:00.000Z\"\n```\n\n| Library  | Time       |\n| -------- | ---------- |\n| Moment   | 1744.459ms |\n| Native   | 819.646ms  |\n| DateFns  | 841.249ms  |\n| DayJs    | -          |\n| Luxon    | 2720.462ms |\n| Temporal | -          |\n\n**[⬆ back to top](#quick-links)**\n\n## Manipulate\n\n### Add\n\nAdd the specified number of days to the given date.\n\n```js\n\u002F\u002F Moment.js\nmoment().add(7, 'days');\n\u002F\u002F => \"2018-09-16T09:12:49.695Z\"\n\n\u002F\u002F Native\nconst now = new Date();\nnow.setDate(now.getDate() + 7);\n\u002F\u002F => \"Sun Sep 16 2018 09:12:49\"\n\n\u002F\u002F date-fns\nimport addDays from 'date-fns\u002FaddDays';\naddDays(new Date(), 7);\n\u002F\u002F => \"2018-09-16T09:12:49.695Z\"\n\n\u002F\u002F dayjs\ndayjs().add(7, 'day');\n\u002F\u002F => \"2018-09-16T09:12:49.695Z\"\n\n\u002F\u002F Luxon\nDateTime.local()\n  .plus({ day: 7 })\n  .toJSDate();\n\u002F\u002F => \"2018-09-16T09:12:49.695Z\"\n\n\u002F\u002F Temporal\nTemporal.Now.zonedDateTimeISO().add(Temporal.Duration.from({days: 7}));\n\u002F\u002F => \"2018-09-16T09:12:49.695Z\"\n```\n\n| Library  | Time       |\n| -------- | ---------- |\n| Moment   | 1309.485ms |\n| Native   | 259.932ms  |\n| DateFns  | 385.394ms  |\n| DayJs    | 1911.881ms |\n| Luxon    | 3919.797ms |\n| Temporal | -          |\n\n**[⬆ back to top](#quick-links)**\n\n### Subtract\n\nSubtract the specified number of days from the given date.\n\n```js\n\u002F\u002F Moment.js\nmoment().subtract(7, 'days');\n\u002F\u002F => \"2018-09-02T09:12:49.695Z\"\n\n\u002F\u002F Native\nconst now = new Date();\nnow.setDate(now.getDate() - 7);\n\u002F\u002F => Sun Sep 09 2018 09:12:49\n\n\u002F\u002F date-fns\nimport subDays from 'date-fns\u002FsubDays';\nsubDays(new Date(), 7);\n\u002F\u002F => \"2018-09-02T09:12:49.695Z\"\n\n\u002F\u002F dayjs\ndayjs().subtract(7, 'day');\n\u002F\u002F => \"2018-09-02T09:12:49.695Z\"\n\n\u002F\u002F Luxon\nDateTime.local()\n  .minus({ day: 7 })\n  .toJSDate();\n\u002F\u002F => \"2018-09-02T09:12:49.695Z\"\n\n\u002F\u002F Temporal\nTemporal.Now.zonedDateTimeISO().subtract(Temporal.Duration.from({days: 7}));\n\u002F\u002F => \"2018-09-02T09:12:49.695Z\"\n```\n\n| Library  | Time       |\n| -------- | ---------- |\n| Moment   | 1278.384ms |\n| Native   | 215.255ms  |\n| DateFns  | 379.057ms  |\n| DayJs    | 1772.593ms |\n| Luxon    | 4028.866ms |\n| Temporal | -          |\n\n**[⬆ back to top](#quick-links)**\n\n### Start of Time\n\nReturn the start of a unit of time for the given date.\n\n```js\n\u002F\u002F Moment.js\nmoment().startOf('month');\n\u002F\u002F => \"2018-08-31T14:00:00.000Z\"\n\n\u002F\u002F date-fns\nimport startOfMonth from 'date-fns\u002FstartOfMonth';\nstartOfMonth(new Date());\n\u002F\u002F => \"2018-08-31T14:00:00.000Z\"\n\n\u002F\u002F dayjs\ndayjs().startOf('month');\n\u002F\u002F => \"2018-08-31T14:00:00.000Z\"\n\n\u002F\u002F Luxon\nDateTime.local().startOf('month');\n\u002F\u002F => \"2018-09-02T09:12:49.695Z\"\n\n\u002F\u002F Temporal\nTemporal.Now.zonedDateTimeISO().with({day: 1});\n\u002F\u002F => \"2018-09-01T14:00:00.000Z\"\n```\n\n| Library  | Time       |\n| -------- | ---------- |\n| Moment   | 1078.948ms |\n| Native   | -          |\n| DateFns  | 398.107ms  |\n| DayJs    | 765.358ms  |\n| Luxon    | 2306.765ms |\n| Temporal | -          |\n\n**[⬆ back to top](#quick-links)**\n\n### End of Time\n\nReturn the end of a unit of time for the given date.\n\n```js\n\u002F\u002F Moment.js\nmoment().endOf('day');\n\u002F\u002F => \"2018-09-09T13:59:59.999Z\"\n\n\u002F\u002F Native\nconst end = new Date();\nend.setHours(23, 59, 59, 999);\nend.toISOString();\n\u002F\u002F => \"2018-09-09T16:59:59.999Z\"\n\n\u002F\u002F date-fns\nimport endOfDay from 'date-fns\u002FendOfDay';\nendOfDay(new Date());\n\u002F\u002F => \"2018-09-09T13:59:59.999Z\"\n\n\u002F\u002F dayjs\ndayjs().endOf('day');\n\u002F\u002F => \"2018-09-09T13:59:59.999Z\"\n\n\u002F\u002F Luxon\nDateTime.local().endOf('day');\n\u002F\u002F => \"2018-09-02T09:12:49.695Z\"\n\n\u002F\u002F Temporal\nTemporal.Now.zonedDateTimeISO().withPlainTime(new Temporal.PlainTime(23,59,59,999,999,999));\n\u002F\u002F => \"2018-09-09T16:59:59.999999999Z\"\n```\n\n| Library  | Time       |\n| -------- | ---------- |\n| Moment   | 1241.304ms |\n| Native   | 225.519ms  |\n| DateFns  | 319.773ms  |\n| DayJs    | 914.425ms  |\n| Luxon    | 9920.529ms |\n| Temporal | -          |\n\n**[⬆ back to top](#quick-links)**\n\n## Display\n\n### Format\n\nReturn the formatted date string in the given format.\n\n```js\n\u002F\u002F Moment.js\nmoment().format('dddd, MMMM Do YYYY, h:mm:ss A');\n\u002F\u002F => \"Sunday, September 9th 2018, 7:12:49 PM\"\nmoment().format('ddd, hA');\n\u002F\u002F => \"Sun, 7PM\"\n\n\u002F\u002F Native\nnew Intl.DateTimeFormat('en-US', { dateStyle: 'full', timeStyle: 'medium' }).format(new Date())\n\u002F\u002F => \"Sunday, September 9, 2018 at 7:12:49 PM\"\nnew Intl.DateTimeFormat('en-US', { weekday: 'short', hour: 'numeric' }).format(new Date())\n\u002F\u002F => \"Sun, 7 PM\"\n\n\u002F\u002F date-fns\nimport { intlFormat } from 'date-fns'\nintlFormat(new Date(), { dateStyle: 'full', timeStyle: 'medium' }, { locale: 'en-US', })\n\u002F\u002F => \"Sunday, September 9, 2018 at 7:12:49 PM\"\nintlFormat(new Date(), { weekday: 'short', hour: 'numeric' }, { locale: 'en-US', })\n\u002F\u002F => \"Sun, 7 PM\"\n\n\u002F\u002F dayjs\ndayjs().format('dddd, MMMM D YYYY, h:mm:ss A');\n\u002F\u002F => \"Sunday, September 9 2018, 7:12:49 PM\"\ndayjs().format('ddd, hA');\n\u002F\u002F => \"Sun, 7PM\"\n\u002F\u002F dayjs ⚠️ requires advancedFormat plugin to support more format tokens\nimport advancedFormat from 'dayjs\u002Fplugin\u002FadvancedFormat';\ndayjs.extend(advancedFormat);\ndayjs().format('dddd, MMMM Do YYYY, h:mm:ss A');\n\u002F\u002F => \"Sunday, September 9th 2018, 7:12:49 PM\"\n\n\u002F\u002F Luxon\nDateTime.fromMillis(time).toFormat('EEEE, MMMM dd yyyy, h:mm:ss a');\n\u002F\u002F => \"Sunday, September 9 2018, 7:12:49 PM\" ⚠️  not support 9th\nDateTime.fromMillis(time).toFormat('EEE, ha');\n\u002F\u002F => \"Sun, 7PM\"\n\n\u002F\u002F Temporal\nnew Intl.DateTimeFormat('en-US', { dateStyle: 'full', timeStyle: 'medium' }).format(Temporal.Now.zonedDateTimeISO())\n\u002F\u002F => \"Sunday, September 9, 2018 at 7:12:49 PM\"\nnew Intl.DateTimeFormat('en-US', { weekday: 'short', hour: 'numeric' }).format(Temporal.Now.zonedDateTimeISO())\n\u002F\u002F => \"Sun, 7 PM\"\n```\n\n**[⬆ back to top](#quick-links)**\n\n### Time from now\n\nReturn time from now.\n\n```js\n\u002F\u002F Moment.js\nmoment(1536484369695).fromNow();\n\u002F\u002F => \"4 days ago\"\n\n\u002F\u002F Native\nnew Intl.RelativeTimeFormat().format(-4, 'day');\n\u002F\u002F => \"4 days ago\"\n\n\u002F\u002F date-fns\nimport formatDistance from 'date-fns\u002FformatDistance';\nformatDistance(new Date(1536484369695), new Date(), { addSuffix: true });\n\u002F\u002F => \"4 days ago\"\n\n\u002F\u002F dayjs ⚠️ requires relativeTime plugin\nimport relativeTime from 'dayjs\u002Fplugin\u002FrelativeTime';\ndayjs.extend(relativeTime);\n\ndayjs(1536484369695).fromNow();\n\u002F\u002F => \"5 days ago\" ⚠️  the rounding method of this plugin is different from moment.js and date-fns, use with care.\n\n\u002F\u002F luxon requires Intl.RelativeTimeFormat\nDateTime.local(2022, 1, 27).toRelative({ base: this })\n\u002F\u002F => \"in 4 months\"\n\n\u002F\u002F Temporal\nnew Intl.RelativeTimeFormat().format(-4, 'day');\n\u002F\u002F => \"4 days ago\"\n```\n\n**[⬆ back to top](#quick-links)**\n\n### Time from x\n\nReturn time from x.\n\n```js\n\u002F\u002F Moment.js\nmoment([2007, 0, 27]).to(moment([2007, 0, 29]));\n\u002F\u002F => \"in 2 days\"\n\n\u002F\u002F date-fns\nimport formatDistance from 'date-fns\u002FformatDistance';\nformatDistance(new Date(2007, 0, 27), new Date(2007, 0, 29));\n\u002F\u002F => \"2 days\"\n\n\u002F\u002F dayjs ⚠️ requires relativeTime plugin\nimport relativeTime from 'dayjs\u002Fplugin\u002FrelativeTime';\ndayjs.extend(relativeTime);\ndayjs('2007-01-27').to(dayjs('2007-01-29'));\n\u002F\u002F => \"in 2 days\"\n\n\u002F\u002F luxon ❌ does not support relative time\n\n\u002F\u002F Temporal\nTemporal.PlainDate.from('2007-01-27').until('2007-01-29');\n\u002F\u002F => Temporal.Duration('P2D')\n```\n\n**[⬆ back to top](#quick-links)**\n\n### Difference\n\nGet the unit of time between the given dates.\n\n```js\n\u002F\u002F Moment.js\nmoment([2007, 0, 27]).diff(moment([2007, 0, 29]));\n\u002F\u002F => -172800000\nmoment([2007, 0, 27]).diff(moment([2007, 0, 29]), 'days');\n\u002F\u002F => -2\n\n\u002F\u002F Native\nnew Date(2007, 0, 27) - new Date(2007, 0, 29);\n\u002F\u002F => -172800000\nMath.ceil(\n  (new Date(2007, 0, 27) - new Date(2007, 0, 29)) \u002F 1000 \u002F 60 \u002F 60 \u002F 24\n);\n\u002F\u002F => -2\n\n\u002F\u002F date-fns\nimport differenceInMilliseconds from 'date-fns\u002FdifferenceInMilliseconds';\ndifferenceInMilliseconds(new Date(2007, 0, 27), new Date(2007, 0, 29));\n\u002F\u002F => -172800000\nimport differenceInDays from 'date-fns\u002FdifferenceInDays';\ndifferenceInDays(new Date(2007, 0, 27), new Date(2007, 0, 29));\n\u002F\u002F => -2\n\n\u002F\u002F dayjs\ndayjs('2007-01-27').diff(dayjs('2007-01-29'), 'milliseconds');\n\u002F\u002F => -172800000\ndayjs('2007-01-27').diff(dayjs('2007-01-29'), 'days');\n\u002F\u002F => -2\n\n\u002F\u002F luxon\nDateTime.local(2007, 1, 27).diff(DateTime.local(2007, 1, 29)).milliseconds;\n\u002F\u002F => -172800000\nDateTime.local(2007, 1, 27).diff(DateTime.local(2007, 1, 29), 'days').days;\n\u002F\u002F => -2\n\n\u002F\u002F Temporal\nTemporal.PlainDate.from('2007-01-27').since('2007-01-29').total({unit: 'millisecond'});\n\u002F\u002F => -172800000\nTemporal.PlainDate.from('2007-01-27').since('2007-01-29').total({unit: 'day'});\n\u002F\u002F => -2\n```\n\n**[⬆ back to top](#quick-links)**\n\n## Query\n\n### Is Before\n\nCheck if a date is before another date.\n\n```js\n\u002F\u002F Moment.js\nmoment('2010-10-20').isBefore('2010-10-21');\n\u002F\u002F => true\n\n\u002F\u002F Native\nnew Date(2010, 10, 20) \u003C new Date(2010, 10, 21);\n\u002F\u002F => true\n\n\u002F\u002F date-fns\nimport isBefore from 'date-fns\u002FisBefore';\nisBefore(new Date(2010, 9, 20), new Date(2010, 9, 21));\n\u002F\u002F => true\n\n\u002F\u002F dayjs\ndayjs('2010-10-20').isBefore('2010-10-21');\n\u002F\u002F => true\n\n\u002F\u002F luxon\nDateTime.fromISO('2010-10-20') \u003C DateTime.fromISO('2010-10-21');\n\u002F\u002F => true\n\n\u002F\u002F Temporal\nTemporal.PlainDate.compare('2010-10-20', '2010-10-21') === -1;\n\u002F\u002F => true\n```\n\n**[⬆ back to top](#quick-links)**\n\n### Is Same\n\nCheck if a date is the same as another date.\n\n```js\n\u002F\u002F Moment.js\nmoment('2010-10-20').isSame('2010-10-21');\n\u002F\u002F => false\nmoment('2010-10-20').isSame('2010-10-20');\n\u002F\u002F => true\nmoment('2010-10-20').isSame('2010-10-21', 'month');\n\u002F\u002F => true\n\n\u002F\u002F Native\nnew Date(2010, 9, 20).valueOf() === new Date(2010, 9, 21).valueOf();\n\u002F\u002F => false\nnew Date(2010, 9, 20).valueOf() === new Date(2010, 9, 20).valueOf();\n\u002F\u002F => true\nnew Date(2010, 9, 20).getTime() === new Date(2010, 9, 20).getTime();\n\u002F\u002F => true\nnew Date(2010, 9, 20).valueOf() === new Date(2010, 9, 20).getTime();\n\u002F\u002F => true\nnew Date(2010, 9, 20).toDateString().substring(4, 7) ===\n  new Date(2010, 9, 21).toDateString().substring(4, 7);\n\u002F\u002F => true\n\n\u002F\u002F date-fns\nimport isSameDay from 'date-fns\u002FisSameDay';\nimport isSameMonth from 'date-fns\u002FisSameMonth';\nisSameDay(new Date(2010, 9, 20), new Date(2010, 9, 21));\n\u002F\u002F => false\nisSameDay(new Date(2010, 9, 20), new Date(2010, 9, 20));\n\u002F\u002F => true\nisSameMonth(new Date(2010, 9, 20), new Date(2010, 9, 21));\n\u002F\u002F => true\n\n\u002F\u002F dayjs\ndayjs('2010-10-20').isSame('2010-10-21');\n\u002F\u002F => false\ndayjs('2010-10-20').isSame('2010-10-20');\n\u002F\u002F => true\ndayjs('2010-10-20').isSame('2010-10-21', 'month');\n\u002F\u002F => true\n\n\u002F\u002F luxon\n(+DateTime.fromISO('2010-10-20') ===\n  +DateTime.fromISO('2010-10-21') +\n    \u002F\u002F => false\n    DateTime.fromISO('2010-10-20')) ===\n  +DateTime.fromISO('2010-10-20');\n\u002F\u002F => true\nDateTime.fromISO('2010-10-20').hasSame(DateTime.fromISO('2010-10-21'), 'month');\n\u002F\u002F => true\n\n\u002F\u002F Temporal\nTemporal.PlainDate.from('2010-10-20').equals('2010-10-21');\n\u002F\u002F => false\nTemporal.PlainDate.from('2010-10-20').equals('2010-10-20');\n\u002F\u002F => true\nTemporal.PlainDate.from('2010-10-20').month === Temporal.PlainDate.from('2010-10-21').month;\n\u002F\u002F => true\n```\n\n**[⬆ back to top](#quick-links)**\n\n### Is After\n\nCheck if a date is after another date.\n\n```js\n\u002F\u002F Moment.js\nmoment('2010-10-20').isAfter('2010-10-19');\n\u002F\u002F => true\n\n\u002F\u002F Native\nnew Date(2010, 9, 20) > new Date(2010, 9, 19);\n\u002F\u002F => true\n\n\u002F\u002F date-fns\nimport isAfter from 'date-fns\u002FisAfter';\nisAfter(new Date(2010, 9, 20), new Date(2010, 9, 19));\n\u002F\u002F => true\n\n\u002F\u002F dayjs\ndayjs('2010-10-20').isAfter('2010-10-19');\n\u002F\u002F => true\n\n\u002F\u002F luxon\nDateTime.fromISO('2010-10-20') > DateTime.fromISO('2010-10-19');\n\u002F\u002F => true\n\n\u002F\u002F Temporal\nTemporal.PlainDate.compare('2010-10-20', '2010-10-19') === 1;\n\u002F\u002F => true\n```\n\n**[⬆ back to top](#quick-links)**\n\n### Is Between\n\nCheck if a date is between two other dates.\n\n```js\n\u002F\u002F Moment.js\nmoment('2010-10-20').isBetween('2010-10-19', '2010-10-25');\n\u002F\u002F => true\n\n\u002F\u002F date-fns\nimport isWithinInterval from 'date-fns\u002FisWithinInterval';\nisWithinInterval(new Date(2010, 9, 20), {\n  start: new Date(2010, 9, 19),\n  end: new Date(2010, 9, 25),\n});\n\u002F\u002F => true\n\n\u002F\u002F dayjs ⚠️ requires isBetween plugin\nimport isBetween from 'dayjs\u002Fplugin\u002FisBetween';\ndayjs.extend(isBetween);\ndayjs('2010-10-20').isBetween('2010-10-19', '2010-10-25');\n\u002F\u002F => true\n\n\u002F\u002F luxon\nInterval.fromDateTimes(\n  DateTime.fromISO('2010-10-19'),\n  DateTime.fromISO('2010-10-25')\n).contains(DateTime.fromISO('2010-10-20'));\n\u002F\u002F => true\n```\n\n**[⬆ back to top](#quick-links)**\n\n### Is Leap Year\n\nCheck if a year is a leap year.\n\n```js\n\u002F\u002F Moment.js\nmoment([2000]).isLeapYear();\n\u002F\u002F => true\n\n\u002F\u002F Native\nnew Date(2000, 1, 29).getDate() === 29;\n\u002F\u002F => true\n\n\u002F\u002F date-fns\nimport isLeapYear from 'date-fns\u002FisLeapYear';\nisLeapYear(new Date(2000, 0, 1));\n\u002F\u002F => true\n\n\u002F\u002F dayjs ⚠️ requires isLeapYear plugin\nimport isLeapYear from 'dayjs\u002Fplugin\u002FisLeapYear';\ndayjs.extend(isLeapYear);\ndayjs('2000-01-01').isLeapYear();\n\u002F\u002F => true\n\n\u002F\u002F luxon\nexpect(DateTime.local(2000).isInLeapYear).toBeTruthy();\n\u002F\u002F => true\n\n\u002F\u002F Temporal\nTemporal.PlainDate.from('2000-01-01').inLeapYear;\n\u002F\u002F => true\n```\n\n**[⬆ back to top](#quick-links)**\n\n### Is a Date\n\nCheck if a variable is a native js Date object.\n\n```js\n\u002F\u002F Moment.js\nmoment.isDate(new Date());\n\u002F\u002F => true\n\n\u002F\u002F Native\nnew Date() instanceof Date;\n\u002F\u002F => true\n\n\u002F\u002F date-fns\nimport isDate from 'date-fns\u002FisDate';\nisDate(new Date());\n\u002F\u002F => true\n\n\u002F\u002F dayjs\ndayjs(new Date()).isValid();\n\n\u002F\u002F luxon\nDateTime.local().isValid;\n\u002F\u002F => true\n\n\u002F\u002F Temporal\nnew Date() instanceof Date;\nTemporal.Now.plainTimeISO() instanceof Temporal.PlainTime;\nTemporal.Now.plainDateISO() instanceof Temporal.PlainDate;\nTemporal.Now.plainDateTimeISO() instanceof Temporal.PlainDateTime;\nTemporal.Now.zonedDateTimeISO() instanceof Temporal.ZonedDateTime;\n\u002F\u002F => true\n```\n\n**[⬆ back to top](#quick-links)**\n\n# License\n\nMIT\n","该项目提供了一系列函数来替代Moment.js，并附带了一个ESLint插件。其核心功能在于通过使用纯函数和模块化设计，解决了Moment.js因复杂API和大体积包导致的性能问题，支持树摇优化，有效减少应用打包后的大小。技术特点包括兼容ES模块、易于迁移至dayjs或date-fns等轻量级日期处理库。适用于对性能敏感且不需要复杂时区支持的Web应用开发场景中，帮助开发者在保持功能的同时提高应用程序加载速度与运行效率。","2026-06-11 02:54:02","top_language"]