UNPKG

nhb-toolbox

Version:

A versatile collection of smart, efficient, and reusable utility functions and classes for everyday development needs.

41 lines (40 loc) 1.75 kB
import { INTERNALS, TIME_ZONE_LABELS, TIME_ZONES } from '../constants.js'; import { isValidUTCOffSet } from '../guards.js'; import { extractMinutesFromUTC, formatUTCOffset } from '../utils.js'; /** * Plugin to inject `timeZone` related methods */ export const timeZonePlugin = (ChronosClass) => { ChronosClass.prototype.timeZone = function (zone) { let targetOffset; let stringOffset; if (isValidUTCOffSet(zone)) { targetOffset = extractMinutesFromUTC(zone); stringOffset = zone; } else { targetOffset = TIME_ZONES?.[zone] ?? TIME_ZONES['UTC']; stringOffset = formatUTCOffset(targetOffset); } const previousOffset = this.getTimeZoneOffsetMinutes(); const relativeOffset = targetOffset - previousOffset; const adjustedTime = new Date(ChronosClass[INTERNALS].internalDate(this).getTime() + relativeOffset * 60 * 1000); const instance = new ChronosClass(adjustedTime); return ChronosClass[INTERNALS].withOrigin(instance, 'timeZone', stringOffset); }; ChronosClass.prototype.getTimeZoneNameShort = function (utc) { const mins = utc ? extractMinutesFromUTC(utc) : this.getTimeZoneOffsetMinutes(); const UTC = formatUTCOffset(mins); const timeZone = TIME_ZONE_LABELS?.[UTC]; let result = timeZone ?.split(' ') ?.filter(Boolean) ?.map((part) => part?.charAt(0)) ?.join('') ?.replace(/\W/g, ''); if (!result) { const zones = Object.entries(TIME_ZONES); result = zones.find((zone) => zone?.[1] === mins)?.[0]; } return result ?? formatUTCOffset(mins); }; };