{"id":20733682,"url":"https://github.com/yukipastelcat/chronometric","last_synced_at":"2025-04-23T22:56:25.319Z","repository":{"id":40729507,"uuid":"234091261","full_name":"yukipastelcat/chronometric","owner":"yukipastelcat","description":"JavaScript library for working with time durations in \"1mo 1w 1d\" format.","archived":false,"fork":false,"pushed_at":"2023-01-05T05:27:11.000Z","size":800,"stargazers_count":2,"open_issues_count":20,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-23T22:56:05.296Z","etag":null,"topics":["datetime","durations","javascript","javascript-library","time","typescript"],"latest_commit_sha":null,"homepage":"https://yukipastelcat.github.io/chronometric/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yukipastelcat.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-01-15T13:52:34.000Z","updated_at":"2020-12-23T11:46:08.000Z","dependencies_parsed_at":"2023-02-03T13:16:12.407Z","dependency_job_id":null,"html_url":"https://github.com/yukipastelcat/chronometric","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yukipastelcat%2Fchronometric","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yukipastelcat%2Fchronometric/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yukipastelcat%2Fchronometric/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yukipastelcat%2Fchronometric/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yukipastelcat","download_url":"https://codeload.github.com/yukipastelcat/chronometric/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250528720,"owners_count":21445513,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["datetime","durations","javascript","javascript-library","time","typescript"],"created_at":"2024-11-17T05:26:34.914Z","updated_at":"2025-04-23T22:56:25.303Z","avatar_url":"https://github.com/yukipastelcat.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# chronometric\n[![codecov](https://codecov.io/gh/yukipastelcat/chronometric/branch/master/graph/badge.svg)](https://codecov.io/gh/yukipastelcat/chronometric)\n![GitHub Workflow Status (master)](https://img.shields.io/github/workflow/status/yukipastelcat/chronometric/CI/master?label=CI%20%28master%29)\n![GitHub Workflow Status (develop)](https://img.shields.io/github/workflow/status/yukipastelcat/chronometric/CI/develop?label=CI%20%28beta%29)\n![npm](https://img.shields.io/npm/l/chronometric)\n![npm](https://img.shields.io/npm/dm/chronometric)\n\nJavaScript library for working with time durations in \"1mo 1w 1d\" format.\n\n## Install\n\n```shell\n$ npm install --save chronometric\n```\n\n## CodeSandbox\n\nYou can find CodeSandbox template [here](https://codesandbox.io/s/chronometric-basic-sandbox-l5sho)\n\n## Basic usage\n\n### Recommended\n\n```js\nimport { Chronometric } from 'chronometric';\n\nconst chronoA = new Chronometric(2200);\nconst chronoB = Chronometric.fromString('1w 1d');\nconst chronoC = new Chronometric({ d: 1, h: 1 });\n```\n\n### Via [Node.js](https://nodejs.org/) require()\n\n```js\nconst { Chronometric } = require('chronometric');\n\nconst chronoA = new Chronometric(2200);\nconst chronoB = Chronometric.fromString('1w 1d');\nconst chronoC = new Chronometric({ d: 1, h: 1 });\n```\n\n### Via [UNPKG](unpkg.com)\n\n```html\n\u003cscript src=\"https://unpkg.com/chronometric@latest\"\u003e\u003c/script\u003e\n\u003cscript\u003e\n  const { Chronometric } = window.chronometric;\n\n  const chronoA = new Chronometric(2200);\n  const chronoB = Chronometric.fromString('1w 1d');\n  const chronoC = new Chronometric({ d: 1, h: 1 });\n\u003c/script\u003e\n```\n\n## Features\n\n### Custom global and instance unit configuration\n\n```js\nimport { Chronometric } from 'chronometric';\n\n// global configuration\nChronometric.defaultConversionRatios = {\n  ms: 1,\n  d: 24 * 60 * 60 * 1000\n};\nconsole.log(Chronometric.fromString(\"1d\") + 0); // will output 86400000\n\n// instance configuration\nconst chronoB = new Chrono(\n  2200,\n  {\n    ms: 1,\n    s: 1000\n  }\n);\nconsole.log(chronoB.toString()); // will output \"2s 200ms\"\n```\n\n### Works with JavaScript [Date](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date) objects\n\n```js\nimport { Chronometric } from 'chronometric';\n\nconst dateFrom = new Date();\nconst dateTo = new Date(0);\n\nconst chrono = new Chronometric(dateFrom - dateTo); // will contain timespan between dateFrom and dateTo\n```\n\n```js\nimport { Chronometric } from 'chronometric';\n\nconst now = Date.now();\nconst tomorrow = new Date(now + Chronometric.fromString(\"1d\"));\nconst inAWeek = new Date(now + Chronometric.fromString(\"1w\"));\n```\n\n### Worktime units\n\n```js\nimport {\n  Chronometric,\n  HOUR_TO_MS_CONVERSION_RATIO,\n  MINUTE_TO_MS_CONVERSION_RATIO\n} from 'chronometric';\n\nChronometric.defaultConversionRatios = {\n\tms: 1,\n  m: MINUTE_TO_MS_CONVERSION_RATIO,\n  h: HOUR_TO_MS_CONVERSION_RATIO,\n  d: 8 * HOUR_TO_MS_CONVERSION_RATIO, // 8 hour work day\n  w: 5 * 8 * HOUR_TO_MS_CONVERSION_RATIO // 5 day work week\n};\n\nconst spentTime = [\"9h 30m\", \"12h 22m\"];\nconst totalSpentTime = new Chronometric(\n  spentTime\n  \t.reduce((acc, item) =\u003e acc + Chronometric.fromString(item), 0)\n).toString(); // \"2d 5h 52m\"\n```\n\n## Known issues\n\n+ 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](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER))\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyukipastelcat%2Fchronometric","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyukipastelcat%2Fchronometric","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyukipastelcat%2Fchronometric/lists"}