UNPKG

@jha28rahul/timezone

Version:

Package that assists in handling timezone related tasks.

100 lines (76 loc) 3.41 kB
const timezones = require("./timezones.js"); // Check if DST is applicable function isDST(timezone, date = new Date()) { const tz = timezones[timezone]; if (!tz || !tz.dst) return false; const jan = new Date(date.getFullYear(), 0, 1).getTimezoneOffset(); const jul = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); return Math.max(jan, jul) !== date.getTimezoneOffset(); } // Get UTC offset based on timezone function getUTCOffset(timezone) { const tz = timezones[timezone]; if (!tz) throw new Error('Invalid timezone'); let offset = tz.offset; if (tz.dst && isDST(timezone)) { offset += tz.dstOffset; } const sign = offset >= 0 ? "+" : "-"; const absOffset = Math.abs(offset); const hours = Math.floor(absOffset); const minutes = (absOffset % 1) * 60; return `${sign}${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`; } // Convert time from one timezone to another function convertTime(time, fromTimezone, toTimezone) { const fromOffset = getUTCOffset(fromTimezone); const toOffset = getUTCOffset(toTimezone); const fromHours = parseInt(fromOffset.slice(1, 3), 10); const fromMinutes = parseInt(fromOffset.slice(4, 6), 10); const toHours = parseInt(toOffset.slice(1, 3), 10); const toMinutes = parseInt(toOffset.slice(4, 6), 10); const signFrom = fromOffset[0] === '+' ? 1 : -1; const signTo = toOffset[0] === '+' ? 1 : -1; const date = new Date(time); const timeInMinutes = date.getMinutes() + date.getHours() * 60; const totalOffset = (signTo * (toHours * 60 + toMinutes)) - (signFrom * (fromHours * 60 + fromMinutes)); const newTimeInMinutes = timeInMinutes + totalOffset; date.setHours(Math.floor(newTimeInMinutes / 60)); date.setMinutes(newTimeInMinutes % 60); return date.toISOString().replace('T', ' ').slice(0, 19); } // All available timezones function listTimezones() { return Object.keys(timezones); } // Current time in any timezone function getCurrentTimeInTimezone(timezone) { return convertTime(new Date().toISOString(), 'UTC', timezone); } // Time difference between two timezones in hours function getTimeDifference(fromTimezone, toTimezone) { const fromOffset = getUTCOffset(fromTimezone); const toOffset = getUTCOffset(toTimezone); const fromHours = parseInt(fromOffset.slice(1, 3), 10); const fromMinutes = parseInt(fromOffset.slice(4, 6), 10); const toHours = parseInt(toOffset.slice(1, 3), 10); const toMinutes = parseInt(toOffset.slice(4, 6), 10); const signFrom = fromOffset[0] === '+' ? 1 : -1; const signTo = toOffset[0] === '+' ? 1 : -1; const differenceInMinutes = ((signTo * (toHours * 60 + toMinutes)) - (signFrom * (fromHours * 60 + fromMinutes))); return differenceInMinutes / 60; } // Convert date to a different timezone function convertDateToTimezone(date, fromTimezone, toTimezone) { const convertedTime = convertTime(date + ' 00:00:00', fromTimezone, toTimezone); return convertedTime.slice(0, 10); } module.exports = { getUTCOffset, convertTime, convertToUTC: (time, fromTimezone) => convertTime(time, fromTimezone, 'UTC'), listTimezones, getCurrentTimeInTimezone, getTimeDifference, convertDateToTimezone };