From a0dc42aed380c60f8db178820a4484cbf3484a75 Mon Sep 17 00:00:00 2001 From: Kizer Date: Sat, 13 Oct 2018 16:47:51 +0200 Subject: [PATCH] add new function roundToNearestMinutes --- CHANGELOG.md | 2 + src/esm/fp/index.js | 2 + src/esm/index.js | 1 + src/esm/locale/index.js | 2 + src/fp/index.js | 2 + src/fp/index.js.flow | 2 + src/fp/test.js | 10 +++ src/index.js | 1 + src/index.js.flow | 5 ++ src/locale/index.js | 2 + src/roundToNearestMinutes/index.js | 32 ++++++++ src/roundToNearestMinutes/test.js | 57 ++++++++++++++ typings.d.ts | 119 +++++++++++++++++++++++++++++ 13 files changed, 237 insertions(+) create mode 100644 src/roundToNearestMinutes/index.js create mode 100644 src/roundToNearestMinutes/test.js diff --git a/CHANGELOG.md b/CHANGELOG.md index d95a83172b..2273361b3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -160,6 +160,8 @@ for the list of changes made since `v2.0.0-alpha.1`. - `lastDayOfDecade` +- Added `roundToNearestMinutes` + ### Changed - **BREAKING**: new format string API for `format` function diff --git a/src/esm/fp/index.js b/src/esm/fp/index.js index fb60905598..080c08961f 100644 --- a/src/esm/fp/index.js +++ b/src/esm/fp/index.js @@ -220,6 +220,8 @@ export {default as min} from './min/index.js' export {default as minWithOptions} from './minWithOptions/index.js' export {default as parse} from './parse/index.js' export {default as parseWithOptions} from './parseWithOptions/index.js' +export {default as roundToNearestMinutes} from './roundToNearestMinutes/index.js' +export {default as roundToNearestMinutesWithOptions} from './roundToNearestMinutesWithOptions/index.js' export {default as setDate} from './setDate/index.js' export {default as setDateWithOptions} from './setDateWithOptions/index.js' export {default as setDay} from './setDay/index.js' diff --git a/src/esm/index.js b/src/esm/index.js index 6f58a4e0f8..c37a5c7445 100644 --- a/src/esm/index.js +++ b/src/esm/index.js @@ -110,6 +110,7 @@ export {default as lastDayOfYear} from './lastDayOfYear/index.js' export {default as max} from './max/index.js' export {default as min} from './min/index.js' export {default as parse} from './parse/index.js' +export {default as roundToNearestMinutes} from './roundToNearestMinutes/index.js' export {default as setDate} from './setDate/index.js' export {default as setDay} from './setDay/index.js' export {default as setDayOfYear} from './setDayOfYear/index.js' diff --git a/src/esm/locale/index.js b/src/esm/locale/index.js index b6e3747619..6ad4390943 100644 --- a/src/esm/locale/index.js +++ b/src/esm/locale/index.js @@ -1,5 +1,6 @@ // This file is generated automatically by `scripts/build/indices.js`. Please, don't change it. +export {default as af} from './af/index.js' export {default as bn} from './bn/index.js' export {default as de} from './de/index.js' export {default as enCA} from './en-CA/index.js' @@ -8,6 +9,7 @@ export {default as enUS} from './en-US/index.js' export {default as eo} from './eo/index.js' export {default as es} from './es/index.js' export {default as fr} from './fr/index.js' +export {default as gl} from './gl/index.js' export {default as he} from './he/index.js' export {default as hu} from './hu/index.js' export {default as it} from './it/index.js' diff --git a/src/fp/index.js b/src/fp/index.js index 8e20e0b115..ec6d9687d3 100644 --- a/src/fp/index.js +++ b/src/fp/index.js @@ -221,6 +221,8 @@ module.exports = { minWithOptions: require('./minWithOptions/index.js'), parse: require('./parse/index.js'), parseWithOptions: require('./parseWithOptions/index.js'), + roundToNearestMinutes: require('./roundToNearestMinutes/index.js'), + roundToNearestMinutesWithOptions: require('./roundToNearestMinutesWithOptions/index.js'), setDate: require('./setDate/index.js'), setDateWithOptions: require('./setDateWithOptions/index.js'), setDay: require('./setDay/index.js'), diff --git a/src/fp/index.js.flow b/src/fp/index.js.flow index 6facc7d30c..575c909c91 100644 --- a/src/fp/index.js.flow +++ b/src/fp/index.js.flow @@ -282,6 +282,8 @@ declare module.exports: { minWithOptions: CurriedFn2, parse: CurriedFn3, parseWithOptions: CurriedFn4, + roundToNearestMinutes: CurriedFn1, + roundToNearestMinutesWithOptions: CurriedFn2, setDate: CurriedFn2, setDateWithOptions: CurriedFn3, setDay: CurriedFn2, diff --git a/src/fp/test.js b/src/fp/test.js index 366fadf05c..d2154b80de 100644 --- a/src/fp/test.js +++ b/src/fp/test.js @@ -1307,6 +1307,16 @@ describe('FP functions', function () { assert.deepEqual(result, new Date(2016, 10 /* Nov */, 5, 4, 4, 4, 0)) }) + it('roundToNearestMinutes', function () { + var result = fp.roundToNearestMinutes()(new Date(2014, 6 /* Jul */, 10, 12, 10, 34, 99)) + assert.deepEqual(result, new Date(2014, 6 /* Jul */, 10, 12, 11)) + }) + + it('roundToNearestMinutesWithOptions', function () { + var result = fp.addMinutesWithOptions({})()(new Date(2014, 6 /* Jul */, 10, 12, 10, 34, 99)) + assert.deepEqual(result, new Date(2014, 6 /* Jul */, 10, 12, 11)) + }) + it('setDate', function () { var result = fp.setDate(30)(new Date(2014, 8 /* Sep */, 1)) assert.deepEqual(result, new Date(2014, 8 /* Sep */, 30)) diff --git a/src/index.js b/src/index.js index 48a8c438ae..d0694efe4a 100644 --- a/src/index.js +++ b/src/index.js @@ -111,6 +111,7 @@ module.exports = { max: require('./max/index.js'), min: require('./min/index.js'), parse: require('./parse/index.js'), + roundToNearestMinutes: require('./roundToNearestMinutes/index.js'), setDate: require('./setDate/index.js'), setDay: require('./setDay/index.js'), setDayOfYear: require('./setDayOfYear/index.js'), diff --git a/src/index.js.flow b/src/index.js.flow index bc35b8369c..841ecd58ae 100644 --- a/src/index.js.flow +++ b/src/index.js.flow @@ -651,6 +651,11 @@ declare module.exports: { options?: Options ) => Date, + roundToNearestMinutes: ( + date: Date | string | number, + options?: Options + ) => Date, + setDate: ( date: Date | string | number, dayOfMonth: number, diff --git a/src/locale/index.js b/src/locale/index.js index 028b557975..5f12c79d5f 100644 --- a/src/locale/index.js +++ b/src/locale/index.js @@ -1,6 +1,7 @@ // This file is generated automatically by `scripts/build/indices.js`. Please, don't change it. module.exports = { + af: require('./af/index.js'), bn: require('./bn/index.js'), de: require('./de/index.js'), enCA: require('./en-CA/index.js'), @@ -9,6 +10,7 @@ module.exports = { eo: require('./eo/index.js'), es: require('./es/index.js'), fr: require('./fr/index.js'), + gl: require('./gl/index.js'), he: require('./he/index.js'), hu: require('./hu/index.js'), it: require('./it/index.js'), diff --git a/src/roundToNearestMinutes/index.js b/src/roundToNearestMinutes/index.js new file mode 100644 index 0000000000..7cee17cd79 --- /dev/null +++ b/src/roundToNearestMinutes/index.js @@ -0,0 +1,32 @@ +import toDate from '../toDate' + +/** + * @name roundToNearestMinutes + * @category Minute Helpers + * @summary Rounds the given date to the nearest minute + * + * @description + * Rounds the given date to the nearest minute + * + * @param {Date|String|Number} date - the date to round + * @param {Options} [options] - the object with options. See [Options]{@link https://date-fns.org/docs/Options} + * @param {0|1|2} [options.additionalDigits=2] - passed to `toDate`. See [toDate]{@link https://date-fns.org/docs/toDate} + * @returns {Date} the new date rounded to the closest minute + * @throws {TypeError} 1 argument required + * @throws {RangeError} `options.additionalDigits` must be 0, 1 or 2 + * + * @example + * // Round 10 July 2014 12:12:34 to nearest minute: + * var result = roundToNearestMinutes(new Date(2014, 6, 10, 12, 12, 34)) + * //=> Thu Jul 10 2014 12:13:00 + */ +export default function roundToNearestMinutes (dirtyDate, dirtyOptions) { + if (arguments.length < 1) { + throw new TypeError('1 argument required, but only none provided present') + } + + var date = toDate(dirtyDate, dirtyOptions) + var addedMinute = date.getSeconds() >= 30 ? 1 : 0 + + return new Date(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes() + addedMinute) +} diff --git a/src/roundToNearestMinutes/test.js b/src/roundToNearestMinutes/test.js new file mode 100644 index 0000000000..40cac1aeaf --- /dev/null +++ b/src/roundToNearestMinutes/test.js @@ -0,0 +1,57 @@ +// @flow +/* eslint-env mocha */ + +import assert from 'power-assert' +import roundToNearestMinutes from '.' + +describe('roundToNearestMinutes', function () { + it('rounds given date to the nearest minute', function () { + var result = roundToNearestMinutes(new Date(2014, 6 /* Jul */, 10, 12, 16, 16)) + assert.deepEqual(result, new Date(2014, 6 /* Jul */, 10, 12, 16, 0)) + }) + + it('accepts a string', function () { + var result = roundToNearestMinutes( + new Date(2014, 6 /* Jul */, 10, 12, 13, 16).toISOString() + ) + assert.deepEqual(result, new Date(2014, 6 /* Jul */, 10, 12, 13, 0)) + }) + + it('accepts a timestamp', function () { + var result = roundToNearestMinutes( + new Date(2014, 6 /* Jul */, 10, 12, 13, 16).getTime() + ) + assert.deepEqual(result, new Date(2014, 6 /* Jul */, 10, 12, 13, 0)) + }) + + it('rounds up 30 seconds and above', function () { + var result = roundToNearestMinutes(new Date(2014, 6 /* Jul */, 10, 12, 10, 30)) + assert.deepEqual(result, new Date(2014, 6 /* Jul */, 10, 12, 11, 0)) + }) + + it('rounds down <30 seconds', function () { + var result = roundToNearestMinutes(new Date(2014, 6 /* Jul */, 10, 12, 13, 29, 999)) + assert.deepEqual(result, new Date(2014, 6 /* Jul */, 10, 12, 13, 0)) + }) + + it('does not mutate the original date', function () { + var date = new Date(2014, 6 /* Jul */, 10, 12, 10, 10, 99) + roundToNearestMinutes(date) + assert.deepEqual(date, new Date(2014, 6 /* Jul */, 10, 12, 10, 10, 99)) + }) + + it('returns `Invalid Date` if the given date is invalid', function () { + var result = roundToNearestMinutes(new Date(NaN)) + assert(result instanceof Date && isNaN(result)) + }) + + it('throws `RangeError` if `options.additionalDigits` is not convertable to 0, 1, 2 or undefined`', function () { + // $ExpectedMistake + var block = roundToNearestMinutes.bind(null, new Date(2014, 6 /* Jul */, 10, 12, 10, 30), {additionalDigits: NaN}) + assert.throws(block, RangeError) + }) + + it('throws TypeError exception if passed less than 1 argument', function () { + assert.throws(roundToNearestMinutes.bind(null), TypeError) + }) +}) diff --git a/typings.d.ts b/typings.d.ts index ec6fdde250..d51927c2a9 100644 --- a/typings.d.ts +++ b/typings.d.ts @@ -788,6 +788,12 @@ declare module 'date-fns' { ): Date namespace parse {} + function roundToNearestMinutes ( + date: Date | string | number, + options?: Options + ): Date + namespace roundToNearestMinutes {} + function setDate ( date: Date | string | number, dayOfMonth: number, @@ -1592,6 +1598,11 @@ declare module 'date-fns/parse' { export = parse } +declare module 'date-fns/roundToNearestMinutes' { + import {roundToNearestMinutes} from 'date-fns' + export = roundToNearestMinutes +} + declare module 'date-fns/setDate' { import {setDate} from 'date-fns' export = setDate @@ -2332,6 +2343,11 @@ declare module 'date-fns/parse/index' { export = parse } +declare module 'date-fns/roundToNearestMinutes/index' { + import {roundToNearestMinutes} from 'date-fns' + export = roundToNearestMinutes +} + declare module 'date-fns/setDate/index' { import {setDate} from 'date-fns' export = setDate @@ -3072,6 +3088,11 @@ declare module 'date-fns/parse/index.js' { export = parse } +declare module 'date-fns/roundToNearestMinutes/index.js' { + import {roundToNearestMinutes} from 'date-fns' + export = roundToNearestMinutes +} + declare module 'date-fns/setDate/index.js' { import {setDate} from 'date-fns' export = setDate @@ -3925,6 +3946,12 @@ declare module 'date-fns/fp' { const parseWithOptions: CurriedFn4 namespace parseWithOptions {} + const roundToNearestMinutes: CurriedFn1 + namespace roundToNearestMinutes {} + + const roundToNearestMinutesWithOptions: CurriedFn2 + namespace roundToNearestMinutesWithOptions {} + const setDate: CurriedFn2 namespace setDate {} @@ -5254,6 +5281,16 @@ declare module 'date-fns/fp/parseWithOptions' { export = parseWithOptions } +declare module 'date-fns/fp/roundToNearestMinutes' { + import {roundToNearestMinutes} from 'date-fns/fp' + export = roundToNearestMinutes +} + +declare module 'date-fns/fp/roundToNearestMinutesWithOptions' { + import {roundToNearestMinutesWithOptions} from 'date-fns/fp' + export = roundToNearestMinutesWithOptions +} + declare module 'date-fns/fp/setDate' { import {setDate} from 'date-fns/fp' export = setDate @@ -6734,6 +6771,16 @@ declare module 'date-fns/fp/parseWithOptions/index' { export = parseWithOptions } +declare module 'date-fns/fp/roundToNearestMinutes/index' { + import {roundToNearestMinutes} from 'date-fns/fp' + export = roundToNearestMinutes +} + +declare module 'date-fns/fp/roundToNearestMinutesWithOptions/index' { + import {roundToNearestMinutesWithOptions} from 'date-fns/fp' + export = roundToNearestMinutesWithOptions +} + declare module 'date-fns/fp/setDate/index' { import {setDate} from 'date-fns/fp' export = setDate @@ -8214,6 +8261,16 @@ declare module 'date-fns/fp/parseWithOptions/index.js' { export = parseWithOptions } +declare module 'date-fns/fp/roundToNearestMinutes/index.js' { + import {roundToNearestMinutes} from 'date-fns/fp' + export = roundToNearestMinutes +} + +declare module 'date-fns/fp/roundToNearestMinutesWithOptions/index.js' { + import {roundToNearestMinutesWithOptions} from 'date-fns/fp' + export = roundToNearestMinutesWithOptions +} + declare module 'date-fns/fp/setDate/index.js' { import {setDate} from 'date-fns/fp' export = setDate @@ -9310,6 +9367,12 @@ declare module 'date-fns/esm' { ): Date namespace parse {} + function roundToNearestMinutes ( + date: Date | string | number, + options?: Options + ): Date + namespace roundToNearestMinutes {} + function setDate ( date: Date | string | number, dayOfMonth: number, @@ -10114,6 +10177,11 @@ declare module 'date-fns/esm/parse' { export default parse } +declare module 'date-fns/esm/roundToNearestMinutes' { + import {roundToNearestMinutes} from 'date-fns/esm' + export default roundToNearestMinutes +} + declare module 'date-fns/esm/setDate' { import {setDate} from 'date-fns/esm' export default setDate @@ -10854,6 +10922,11 @@ declare module 'date-fns/esm/parse/index' { export default parse } +declare module 'date-fns/esm/roundToNearestMinutes/index' { + import {roundToNearestMinutes} from 'date-fns/esm' + export default roundToNearestMinutes +} + declare module 'date-fns/esm/setDate/index' { import {setDate} from 'date-fns/esm' export default setDate @@ -11594,6 +11667,11 @@ declare module 'date-fns/esm/parse/index.js' { export default parse } +declare module 'date-fns/esm/roundToNearestMinutes/index.js' { + import {roundToNearestMinutes} from 'date-fns/esm' + export default roundToNearestMinutes +} + declare module 'date-fns/esm/setDate/index.js' { import {setDate} from 'date-fns/esm' export default setDate @@ -12447,6 +12525,12 @@ declare module 'date-fns/esm/fp' { const parseWithOptions: CurriedFn4 namespace parseWithOptions {} + const roundToNearestMinutes: CurriedFn1 + namespace roundToNearestMinutes {} + + const roundToNearestMinutesWithOptions: CurriedFn2 + namespace roundToNearestMinutesWithOptions {} + const setDate: CurriedFn2 namespace setDate {} @@ -13776,6 +13860,16 @@ declare module 'date-fns/esm/fp/parseWithOptions' { export default parseWithOptions } +declare module 'date-fns/esm/fp/roundToNearestMinutes' { + import {roundToNearestMinutes} from 'date-fns/esm/fp' + export default roundToNearestMinutes +} + +declare module 'date-fns/esm/fp/roundToNearestMinutesWithOptions' { + import {roundToNearestMinutesWithOptions} from 'date-fns/esm/fp' + export default roundToNearestMinutesWithOptions +} + declare module 'date-fns/esm/fp/setDate' { import {setDate} from 'date-fns/esm/fp' export default setDate @@ -15256,6 +15350,16 @@ declare module 'date-fns/esm/fp/parseWithOptions/index' { export default parseWithOptions } +declare module 'date-fns/esm/fp/roundToNearestMinutes/index' { + import {roundToNearestMinutes} from 'date-fns/esm/fp' + export default roundToNearestMinutes +} + +declare module 'date-fns/esm/fp/roundToNearestMinutesWithOptions/index' { + import {roundToNearestMinutesWithOptions} from 'date-fns/esm/fp' + export default roundToNearestMinutesWithOptions +} + declare module 'date-fns/esm/fp/setDate/index' { import {setDate} from 'date-fns/esm/fp' export default setDate @@ -16736,6 +16840,16 @@ declare module 'date-fns/esm/fp/parseWithOptions/index.js' { export default parseWithOptions } +declare module 'date-fns/esm/fp/roundToNearestMinutes/index.js' { + import {roundToNearestMinutes} from 'date-fns/esm/fp' + export default roundToNearestMinutes +} + +declare module 'date-fns/esm/fp/roundToNearestMinutesWithOptions/index.js' { + import {roundToNearestMinutesWithOptions} from 'date-fns/esm/fp' + export default roundToNearestMinutesWithOptions +} + declare module 'date-fns/esm/fp/setDate/index.js' { import {setDate} from 'date-fns/esm/fp' export default setDate @@ -19530,6 +19644,11 @@ interface dateFns { options?: Options ): Date + roundToNearestMinutes( + date: Date | string | number, + options?: Options + ): Date + setDate( date: Date | string | number, dayOfMonth: number,