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
JavaScript
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);
};
};