date-and-time
This library is a minimalist collection of functions for manipulating JS date and time. It's tiny, simple, easy to learn.
Why
JS modules nowadays are getting more huge and complex, and there are also many dependencies. Trying to keep each module simple and small is meaningful.
Features
- Minimalist. Less than 2k. (minified and gzipped)
- Extensible. Plugin system support.
- Multi language support.
- Universal / Isomorphic. Wherever JS runtime works.
- Older browser support. Even works on IE6. :)
Install
npm install date-and-time --save
<script src="/path/to/date-and-time.min.js"></script>
Recent Changes
-
0.11.0
- Added a
compile()
function that precompiling a date string for the parser. In case of processing many date string with one format, by using this function, you could get results faster than before.
date.parse('Mar. 22 2019 2:54:21 p.m.', 'MMM. D YYYY h:m:s A');
date.parse('Jul. 27 2019 4:15:24 a.m.', 'MMM. D YYYY h:m:s A');
date.parse('Dec. 25 2019 3:51:11 a.m.', 'MMM. D YYYY h:m:s A');
const pattern = date.compile('MMM. D YYYY h:m:s A');
date.parse('Mar. 22 2019 2:54:21 p.m.', pattern);
date.parse('Jul. 27 2019 4:15:24 a.m.', pattern);
date.parse('Dec. 25 2019 3:51:11 a.m.', pattern);
const pattern = date.compile('MMM. D YYYY h:m:s A');
date.isValid('Mar. 22 2019 2:54:21 p.m.', pattern);
-
0.10.0
- The
YYYY
token has come to require 4 digits in the parse()
, the preparse()
and the isValid()
(Breaking Change).
date.parse('31-12-0123', 'DD-MM-YYYY');
date.parse('31-12-123', 'DD-MM-YYYY');
- The
YY
token has come to require 2 digits in the above functions (Breaking Change).
date.parse('31-12-03', 'DD-MM-YY');
date.parse('31-12-3', 'DD-MM-YY');
- Added a
Y
token to support year, 4 or less digits in the above functions. This new token, Y
is equivalent to the previous YYYY
token.
date.parse('31-12-123', 'DD-MM-Y');
date.parse('31-12-3', 'DD-MM-Y');
-
0.9.0 (Locale Update)
- Renewal of the locale system. Some functions were merged (Breaking Change).
- Added a plugin system. You could extend a formatter and a parser by using this mechanism.
- With the addition of the plugin system, the
format()
has come to accept a user original token.
-
0.8.0 (Parser Update)
- The
parse()
has come to return Invalid Date
instead of NaN
when parsing is failure (Breaking Change). - Added
preparse()
. It returns a Date Structure. - The
isValid()
has come to take a Date Structure in addition to a date string. - The
isLeapYear()
has come to take a year (number type) instead of a Date object (Breaking Change).
Usage
const date = require('date-and-time');
import date from 'date-and-time';
window.date;
API
format(dateObj, formatString[, utc])
- Formatting a date.
- @param {Date} dateObj - a Date object
- @param {string} formatString - a format string
- @param {boolean} [utc] - output as UTC
- @returns {string} a formatted string
const now = new Date();
date.format(now, 'YYYY/MM/DD HH:mm:ss');
date.format(now, 'ddd., MMM. DD YYYY');
date.format(now, 'hh:mm A [GMT]Z');
date.format(now, 'hh:mm A [GMT]Z', true);
Available tokens and their meanings are as follows:
token | meaning | example |
---|
YYYY | year | 0999, 2015 |
YY | year | 05, 99 |
Y | year | 2, 44, 888, 2015 |
MMMM | month | January, December |
MMM | month | Jan, Dec |
MM | month | 01, 12 |
M | month | 1, 12 |
DDD (*) | day | 1st, 2nd, 3rd |
DD | day | 02, 31 |
D | day | 2, 31 |
dddd | day of week | Friday, Sunday |
ddd | day of week | Fri, Sun |
dd | day of week | Fr, Su |
HH | 24-hour | 23, 08 |
H | 24-hour | 23, 8 |
A | meridiem | a.m., p.m. |
a (*) | meridiem | A.M., P.M. |
AA (*) | meridiem | AM, PM |
aa (*) | meridiem | am, pm |
hh | 12-hour | 11, 08 |
h | 12-hour | 11, 8 |
mm | minute | 14, 07 |
m | minute | 14, 7 |
ss | second | 05, 10 |
s | second | 5, 10 |
SSS | millisecond | 753, 022 |
SS | millisecond | 75, 02 |
S | millisecond | 7, 0 |
Z | timezone | +0100, -0800 |
(*) Not available by default. See PLUGINS.md for details.
Strings in parenthese [...]
in the formatString
will be ignored as comments:
date.format(new Date(), 'DD-[MM]-YYYY');
date.format(new Date(), '[DD-[MM]-YYYY]');
NOTE 2. Output as UTC
This function usually outputs a local date-time string. Set to true a utc
option (the 3rd parameter) if you would like to get a UTC date/time string.
date.format(new Date(), 'hh:mm A [GMT]Z');
date.format(new Date(), 'hh:mm A [GMT]Z', true);
NOTE 3. More Tokens
You could also define your own tokens. See PLUGINS.md for details.
compile(formatString)
- Compiling a format string for the parser.
- @param {string} formatString - a format string
- @returns {Array.<string>} a compiled object
const pattern = date.compile('MMM. D YYYY h:m:s A');
date.parse('Mar. 22 2019 2:54:21 p.m.', pattern);
date.parse('Jul. 27 2019 4:15:24 a.m.', pattern);
date.parse('Dec. 25 2019 3:51:11 a.m.', pattern);
If you are going to call the parse()
or the isValid()
many times with one string format, recommended to precompile and reuse it for performance.
parse(dateString, arg[, utc])
- Parsing a date string.
- @param {string} dateString - a date string
- @param {string|Array.<string>} arg - a format string or a compiled object
- @param {boolean} [utc] - input as UTC
- @returns {Date} a constructed date
date.parse('2015/01/02 23:14:05', 'YYYY/MM/DD HH:mm:ss');
date.parse('02-01-2015', 'DD-MM-YYYY');
date.parse('11:14:05 p.m.', 'hh:mm:ss A');
date.parse('11:14:05 p.m.', 'hh:mm:ss A', true);
date.parse('Jam. 1 2017', 'MMM. D YYYY');
date.parse('Feb. 29 2016', 'MMM. D YYYY');
date.parse('Feb. 29 2017', 'MMM. D YYYY');
Available tokens and their meanings are as follows:
token | meaning | example |
---|
YYYY | year | 0999, 2015 |
YY | year | 05, 99 |
Y | year | 2, 44, 88, 2015 |
MMMM | month | January, December |
MMM | month | Jan, Dec |
MM | month | 01, 12 |
M | month | 1, 12 |
DD | day | 02, 31 |
D | day | 2, 31 |
HH | 24-hour | 23, 08 |
H | 24-hour | 23, 8 |
hh | 12-hour | 11, 08 |
h | 12-hour | 11, 8 |
A | meridiem | a.m., p.m. |
A (*) | meridiem | A.M., P.M. |
A (*) | meridiem | AM, PM |
A (*) | meridiem | am, pm |
mm | minute | 14, 07 |
m | minute | 14, 7 |
ss | second | 05, 10 |
s | second | 5, 10 |
SSS | millisecond | 753, 022 |
SS | millisecond | 75, 02 |
S | millisecond | 7, 0 |
(*) Not available by default. See PLUGINS.md for details.
NOTE 1. Invalid Date
If the function fails to parse, it will return Invalid Date
. Notice that the Invalid Date
is a Date object, not NaN
or null
. You could tell whether the Date object is invalid as follows:
const today = date.parse('Jam. 1 2017', 'MMM. D YYYY');
if (isNaN(today)) {
}
NOTE 2. Input as UTC
This function usually assumes the dateString
is local date-time. Set to true a utc
option (the 3rd parameter) if it is UTC.
date.parse('11:14:05 p.m.', 'hh:mm:ss A');
date.parse('11:14:05 p.m.', 'hh:mm:ss A', true);
NOTE 3. Default Date Time
Default date is January 1, 1970
, time is 00:00:00.000
. Values not passed will be complemented with them:
date.parse('11:14:05 p.m.', 'hh:mm:ss A');
date.parse('Feb. 2000', 'MMM. YYYY');
NOTE 4. Max Date / Min Date
Parsable maximum date is December 31, 9999
, minimum date is January 1, 0001
.
date.parse('Dec. 31 9999', 'MMM. D YYYY');
date.parse('Dec. 31 10000', 'MMM. D YYYY');
date.parse('Jan. 1 0001', 'MMM. D YYYY');
date.parse('Jan. 1 0000', 'MMM. D YYYY');
NOTE 5. Auto Mapping
The YY
token maps the year 69 or less to the 2000s, the year 70 or more to the 1900s. Using it is not recommended.
date.parse('Dec. 31 00', 'MMM. D YY');
date.parse('Dec. 31 69', 'MMM. D YY');
date.parse('Dec. 31 70', 'MMM. D YY');
date.parse('Dec. 31 99', 'MMM. D YY');
NOTE 6. 12-hour notation and Meridiem
If use the hh
or h
(12-hour) token, use together the A
(meridiem) token to get the right value.
date.parse('11:14:05', 'hh:mm:ss');
date.parse('11:14:05 p.m.', 'hh:mm:ss A');
Strings in parenthese [...]
in the formatString will be ignored as comments:
date.parse('12 hours 34 minutes', 'HH hours mm minutes');
date.parse('12 hours 34 minutes', 'HH [hours] mm [minutes]');
NOTE 8. Wildcard
A white space works as a wildcard token. This token is not interpret into anything. This means it can be ignored a specific variable string. For example, when you want to ignore a time part from a date string, you can write as follows:
date.parse('2015/01/02 11:14:05', 'YYYY/MM/DD');
date.parse('2015/01/02 11:14:05', 'YYYY/MM/DD ');
preparse(dateString, arg)
- Pre-parsing a date string.
- @param {string} dateString - a date string
- @param {string|Array.<string>} arg - a format string or a compiled object
- @returns {Object} a date structure
This function takes exactly the same parameters with the parse()
, but returns a date structure as follows unlike it:
date.preparse('2015/01/02 23:14:05', 'YYYY/MM/DD HH:mm:ss');
{
Y: 2015,
M: 1,
D: 2,
H: 23,
A: 0,
h: 0,
m: 14,
s: 5,
S: 0,
_index: 19,
_length: 19,
_match: 6
}
This object shows a parsing result. You would be able to tell from it how the date string was parsed(, or why the parsing was failed).
isValid(arg1[, arg2])
- Validation.
- @param {Object|string} arg1 - a date structure or a date string
- @param {string|Array.<string>} [arg2] - a format string or a compiled object
- @returns {boolean} whether the date string is a valid date
This function takes either exactly the same parameters with the parse()
or a date structure which the preparse()
returns, evaluates the validity of them.
date.isValid('2015/01/02 23:14:05', 'YYYY/MM/DD HH:mm:ss');
date.isValid('29-02-2015', 'DD-MM-YYYY');
const result = date.preparse('2015/01/02 23:14:05', 'YYYY/MM/DD HH:mm:ss');
date.isValid(result);
addYears(dateObj, years)
- Adding years.
- @param {Date} dateObj - a Date object
- @param {number} years - number of years to add
- @returns {Date} a date after adding the value
const now = new Date();
const next_year = date.addYears(now, 1);
addMonths(dateObj, months)
- Adding months.
- @param {Date} dateObj - a Date object
- @param {number} months - number of months to add
- @returns {Date} a date after adding the value
const now = new Date();
const next_month = date.addMonths(now, 1);
addDays(dateObj, days)
- Adding days.
- @param {Date} dateObj - a Date object
- @param {number} days - number of days to add
- @returns {Date} a date after adding the value
const now = new Date();
const yesterday = date.addDays(now, -1);
addHours(dateObj, hours)
- Adding hours.
- @param {Date} dateObj - a Date object
- @param {number} hours - number of hours to add
- @returns {Date} a date after adding the value
const now = new Date();
const an_hour_ago = date.addHours(now, -1);
addMinutes(dateObj, minutes)
- Adding minutes.
- @param {Date} dateObj - a Date object
- @param {number} minutes - number of minutes to add
- @returns {Date} a date after adding the value
const now = new Date();
const two_minutes_later = date.addMinutes(now, 2);
addSeconds(dateObj, seconds)
- Adding seconds.
- @param {Date} dateObj - a Date object
- @param {number} seconds - number of seconds to add
- @returns {Date} a date after adding the value
const now = new Date();
const three_seconds_ago = date.addSeconds(now, -3);
addMilliseconds(dateObj, milliseconds)
- Adding milliseconds.
- @param {Date} dateObj - a Date object
- @param {number} milliseconds - number of milliseconds to add
- @returns {Date} a date after adding the value
const now = new Date();
const a_millisecond_later = date.addMilliseconds(now, 1);
subtract(date1, date2)
- Subtracting.
- @param {Date} date1 - a Date object
- @param {Date} date2 - a Date object
- @returns {Object} a result object subtracting date2 from date1
const today = new Date(2015, 0, 2);
const yesterday = new Date(2015, 0, 1);
date.subtract(today, yesterday).toDays();
date.subtract(today, yesterday).toHours();
date.subtract(today, yesterday).toMinutes();
date.subtract(today, yesterday).toSeconds();
date.subtract(today, yesterday).toMilliseconds();
isLeapYear(y)
- Leap year.
- @param {number} y - year
- @returns {boolean} whether the year is a leap year
date.isLeapYear(2015);
date.isLeapYear(2012);
isSameDay(date1, date2)
- Comparison of two dates.
- @param {Date} date1 - a Date object
- @param {Date} date2 - a Date object
- @returns {boolean} whether the dates are the same day (times are ignored)
const date1 = new Date(2017, 0, 2, 0);
const date2 = new Date(2017, 0, 2, 23, 59);
const date3 = new Date(2017, 0, 1, 23, 59);
date.isSameDay(date1, date2);
date.isSameDay(date1, date3);
locale([code[, locale]])
- Change locale or setting a new locale definition.
- @param {string} [code] - language code
- @param {Object} [locale] - locale definition
- @returns {string} current language code
Returns current language code if called without any parameters.
date.locale();
To switch to any other language, call it with a language code.
date.locale('es');
To define a new locale, call it with new language code and a locale definition. See LOCALE.md for details.
extend(extension)
- Locale extension.
- @param {Object} extension - locale definition
- @returns {void}
Extends a current locale (formatter and parser). See PLUGINS.md for details.
plugin(name[, extension])
- Plugin import or definition.
- @param {string} name - plugin name
- @param {Object} [extension] - locale definition
- @returns {void}
Plugin is a named locale definition defined with the extend()
. See PLUGINS.md for details.
Browser Support
Chrome, Firefox, Safari, Edge, and Internet Explorer 6+.
License
MIT