Skip to content

yukipastelcat/chronometric

Repository files navigation

chronometric

codecov GitHub Workflow Status (master) GitHub Workflow Status (develop) npm npm

JavaScript library for working with time durations in "1mo 1w 1d" format.

Install

$ npm install --save chronometric

CodeSandbox

You can find CodeSandbox template here

Basic usage

Recommended

import { Chronometric } from 'chronometric';

const chronoA = new Chronometric(2200);
const chronoB = Chronometric.fromString('1w 1d');
const chronoC = new Chronometric({ d: 1, h: 1 });

Via Node.js require()

const { Chronometric } = require('chronometric');

const chronoA = new Chronometric(2200);
const chronoB = Chronometric.fromString('1w 1d');
const chronoC = new Chronometric({ d: 1, h: 1 });

Via UNPKG

<script src="https://unpkg.com/chronometric@latest"></script>
<script>
  const { Chronometric } = window.chronometric;

  const chronoA = new Chronometric(2200);
  const chronoB = Chronometric.fromString('1w 1d');
  const chronoC = new Chronometric({ d: 1, h: 1 });
</script>

Features

Custom global and instance unit configuration

import { Chronometric } from 'chronometric';

// global configuration
Chronometric.defaultConversionRatios = {
  ms: 1,
  d: 24 * 60 * 60 * 1000
};
console.log(Chronometric.fromString("1d") + 0); // will output 86400000

// instance configuration
const chronoB = new Chrono(
  2200,
  {
    ms: 1,
    s: 1000
  }
);
console.log(chronoB.toString()); // will output "2s 200ms"

Works with JavaScript Date objects

import { Chronometric } from 'chronometric';

const dateFrom = new Date();
const dateTo = new Date(0);

const chrono = new Chronometric(dateFrom - dateTo); // will contain timespan between dateFrom and dateTo
import { Chronometric } from 'chronometric';

const now = Date.now();
const tomorrow = new Date(now + Chronometric.fromString("1d"));
const inAWeek = new Date(now + Chronometric.fromString("1w"));

Worktime units

import {
  Chronometric,
  HOUR_TO_MS_CONVERSION_RATIO,
  MINUTE_TO_MS_CONVERSION_RATIO
} from 'chronometric';

Chronometric.defaultConversionRatios = {
	ms: 1,
  m: MINUTE_TO_MS_CONVERSION_RATIO,
  h: HOUR_TO_MS_CONVERSION_RATIO,
  d: 8 * HOUR_TO_MS_CONVERSION_RATIO, // 8 hour work day
  w: 5 * 8 * HOUR_TO_MS_CONVERSION_RATIO // 5 day work week
};

const spentTime = ["9h 30m", "12h 22m"];
const totalSpentTime = new Chronometric(
  spentTime
  	.reduce((acc, item) => acc + Chronometric.fromString(item), 0)
).toString(); // "2d 5h 52m"

Known issues

  • When using big and small conversion ratios simultaniously (i.e. 1 year and 1 nanosecond to milliseconds) small ones can be lost due to JavaScript number type precision (see Number.MAX_SAFE_INTEGER)