2.0.0 • Published 26 days ago

@rwf-projects/time-formatter v2.0.0

Weekly downloads
-
License
MIT
Repository
github
Last release
26 days ago

time-formatter

The time-formatter package converts a number representing elapsed time into a human readable string.

Examples

import { formatTime } from '@rwf-projects/time-formatter';

const formattedTime = formatTime(4.256128);
// 4 seconds and 256.128 milliseconds
import { formatTime } from '@rwf-projects/time-formatter';

const options = { minUnit: 'second', maxUnit: 'hour' };
const formattedTime = formatTime(94592, options);
// 26 hours, 16 minutes and 32 seconds
import { formatTime } from '@rwf-projects/time-formatter';

const options = { precision: 1, minUnit: 'microsecond' };
const formattedTime = formatTime(792496.032064128, options);
// 1 week, 2 days, 4 hours, 8 minutes, 16 seconds, 32 milliseconds and 64.1 microseconds
import { formatTime } from '@rwf-projects/time-formatter';

const formattedTime: string = formatTime(4.256128);
// 4 seconds and 256.128 milliseconds
import { formatTime, Options, Units } from '@rwf-projects/time-formatter';

const options: Partial<Options> = { minUnit: Units.SECOND, maxUnit: Units.HOUR };
const formattedTime: string = formatTime(94592, options);
// 26 hours, 16 minutes and 32 seconds
import { formatTime, Options, Units } from '@rwf-projects/time-formatter';

const options: Partial<Options> = { precision: 1, minUnit: Units.MICROSECOND };
const formattedTime: string = formatTime(792496.032064128, options);
// 1 week, 2 days, 4 hours, 8 minutes, 16 seconds, 32 milliseconds and 64.1 microseconds

Features

  • Outputs a nice human-readable string representig a time interval;
  • Output units from weeks down to microsecond;
  • Minimum and maximum units are configurable;
  • Arbitrary precision in the lower unit;
  • Translatable;
  • Works with require and import.

Available units

The available units are week, day, hour, minute, second, millisecond and microsecond.
In TypeScript these units are available through the Units enum.

Why not bigger than week?

  • Because bigger units are not precise enough. A week is exactly 7 days. A month can have any duration between 28 and 31 days.

Why not smaller than microsecond?

  • Because the way JavaScript handles floating point numbers introduces errors at very small ranges;
  • It is also the maximum precision performance.now returns.

Installation

npm

npm install --save time-formatter

yarn

yarn add time-formatter

Usage

Start by importing.

import { formatTime } from '@rwf-projects/time-formatter';

... or requiring.

const { formatTime } = require('@rwf-projects/time-formatter');

Then

const formattedTime = formatTime(time, [options], [i18n]);
import { formatTime, Options, I18n } from '@rwf-projects/time-formatter';

const formattedTime: string = formatTime(time, [options], [i18n]);

Options

An object with the following keys:

OptionTypeDefault value in JSDefault value in TSDescription
precisionnumber33The amount of decimal places the smallest unit will have
minUnitstring'millisecond'Units.MILLISECONDThe smallest unit that will be used. One of the available units
maxUnitstring'week'Units.WEEKThe biggest unit that will be used. One of the available units

I18n

The generated string does not have to be in English. You can specify any language, as long as it follows the format unit1, unit2 [...] and unitN.
To do so, pass the time formatter funtion an i18n object with the translations.

If you don't need to change the default options, then pass any falsy value.

I18n keys

Each i18n unit key has a mandatory singular key and an optional plural key.
The and key, used in [...] and unitN does not use singular or plural.

Key in JSKey in TSDefault singular valueDefault plural value
weekUnits.WEEK'week'Singular value + 's'
dayUnits.DAY'day'Singular value + 's'
hourUnits.HOUR'hour'Singular value + 's'
minuteUnits.MINUTE'minute'Singular value + 's'
secondUnits.SECOND'second'Singular value + 's'
millisecondUnits.MILLISECOND'millisecond'Singular value + 's'
microsecondUnits.MICROSECOND'microsecond'Singular value + 's'
andand'and'N/A

Examples

Full translation

You can translate all the keys.

const fullI18n = {
  week: {
    singular: 'semana'
  },
  day: {
    singular: 'dia'
  },
  hour: {
    singular: 'hora'
  },
  minute: {
    singular: 'minuto'
  },
  second: {
    singular: 'segundo'
  },
  millisecond: {
    singular: 'milissegundo'
  },
  microsecond: {
    singular: 'microssegundo'
  },
  and: 'e'
};

const formattedTime = formatTime(694861.001001, null, fullI18n);
// 1 semana, 1 dia, 1 hora, 1 minuto, 1 segundo e 1.001 milissegundos
const fullI18n: I18n = {
  [Units.WEEK]: {
    singular: 'semana'
  },
  [Units.DAY]: {
    singular: 'dia'
  },
  [Units.HOUR]: {
    singular: 'hora'
  },
  [Units.MINUTE]: {
    singular: 'minuto'
  },
  [Units.SECOND]: {
    singular: 'segundo'
  },
  [Units.MILLISECOND]: {
    singular: 'milissegundo'
  },
  [Units.MICROSECOND]: {
    singular: 'microssegundo'
  },
  and: 'e'
};

const formattedTime: string = formatTime(694861.001001, null, fullI18n);
// 1 semana, 1 dia, 1 hora, 1 minuto, 1 segundo e 1.001 milissegundos

Partial translation

You can just specify shorter units, for example.

const options = { minUnit: 'microsecond' };

const partialI18n = {
  millisecond: {
    singular: 'ms',
    plural: 'ms'
  },
  microsecond: {
    singular: 'μs',
    plural: 'μs'
  }
};

const formattedTime = formatTime(694861.001001, options, partialI18n);
// 1 week, 1 day, 1 hour, 1 minute, 1 second, 1 ms and 1 μs
const options: Partial<Options> = { minUnit: 'microsecond' };

const partialI18n: Partial<I18n> = {
  [Units.MILLISECOND]: {
    singular: 'ms',
    plural: 'ms'
  },
  [Units.MICROSECOND]: {
    singular: 'μs',
    plural: 'μs'
  }
};

const formattedTime: string = formatTime(694861.001001, options, partialI18n);
// 1 week, 1 day, 1 hour, 1 minute, 1 second, 1 ms and 1 μs
2.0.0

26 days ago

1.0.7

27 days ago

1.0.2

30 days ago

1.0.1

30 days ago

1.0.5

29 days ago

1.0.4

30 days ago

1.0.3

30 days ago

1.0.0

1 month ago