/// import epoch = require('./epoch'); /** * Date and epoch functions * * The standard way to store epoch in the database is seconds from 1999, in UTC. The following routines all assume * that standard. * */ export var timezones: Array<{ code: string; name: string; gmtOffset?: number; dstStart?: Date; dstEnd?: Date; }> = []; timezones[1] = { code: 'MIT', name: 'GMT -11:00 - Midway Islands Time (MIT)', gmtOffset: -11 }; timezones[2] = { code: 'HST', name: 'GMT -10:00 - Hawaii Standard Time (HST)', gmtOffset: -10 }; timezones[3] = { code: 'AST', name: 'GMT -9:00 - Alaska Standard Time (AST)', gmtOffset: -9, dstStart: new Date(Date.UTC(2015, 2, 8, 2)), dstEnd: new Date(Date.UTC(2015, 10, 1, 2)) }; timezones[4] = { code: 'PST', name: 'GMT -8:00 - Pacific Standard Time (PST)', gmtOffset: -8, dstStart: new Date(Date.UTC(2015, 2, 8, 2)), dstEnd: new Date(Date.UTC(2015, 10, 1, 2)) }; timezones[5] = { code: 'PNT', name: 'GMT -7:00 - Phoenix Standard Time (PNT)', gmtOffset: -7 }; timezones[6] = { code: 'MST', name: 'GMT -7:00 - Mountain Standard Time (MST)', gmtOffset: -7, dstStart: new Date(Date.UTC(2015, 2, 8, 2)), dstEnd: new Date(Date.UTC(2015, 10, 1, 2)) }; timezones[7] = { code: 'CST', name: 'GMT -6:00 - Central Standard Time (CST)', gmtOffset: -6, dstStart: new Date(Date.UTC(2015, 2, 8, 2)), dstEnd: new Date(Date.UTC(2015, 10, 1, 2)) }; timezones[8] = { code: 'EST', name: 'GMT -5:00 - Eastern Standard Time (EST)', gmtOffset: -5, dstStart: new Date(Date.UTC(2015, 2, 8, 2)), dstEnd: new Date(Date.UTC(2015, 10, 1, 2)) }; timezones[9] = { code: 'IET', name: 'GMT -5:00 - Indiana Eastern Standard Time (IET)', gmtOffset: -5 }; timezones[10] = { code: 'PRT', name: 'GMT -4:00 - Puerto Rico/US Virgin Islands Time (PRT)', gmtOffset: -4 }; timezones[11] = { code: 'CNT', name: 'GMT -3:30 - Canada Newfoundland Time (CNT)', gmtOffset: -3.5, dstStart: new Date(Date.UTC(2015, 2, 8, 1)), dstEnd: new Date(Date.UTC(2015, 10, 1, 1)) }; timezones[12] = { code: 'AGT', name: 'GMT -3:00 - Argentina Standard Time (AGT)', gmtOffset: -3 }; timezones[13] = { code: 'BET', name: 'GMT -3:00 - Brazil Eastern Time (BET)', gmtOffset: -3 }; timezones[14] = { code: 'CAT', name: 'GMT -1:00 - Central African Time (CAT)', gmtOffset: -1 }; timezones[15] = { code: 'GMT', name: 'GMT 0:00 - Greenwich Mean Time (GMT)', gmtOffset: 0, dstStart: new Date(Date.UTC(2015, 2, 29, 1)), dstEnd: new Date(Date.UTC(2015, 10, 1, 1)) }; timezones[16] = { code: 'ECT', name: 'GMT +1:00 - European Central Time (ECT)', gmtOffset: 1, dstStart: new Date(Date.UTC(2015, 2, 29, 1)), dstEnd: new Date(Date.UTC(2015, 10, 1, 1)) }; timezones[17] = { code: 'EET', name: 'GMT +1:00 - Eastern European Time (EET)', gmtOffset: 1, dstStart: new Date(Date.UTC(2015, 2, 29, 1)), dstEnd: new Date(Date.UTC(2015, 10, 1, 1)) }; timezones[18] = { code: 'ART', name: 'GMT +2:00 - (Arabic) Egypt Standard Time (ART)', gmtOffset: 2, dstStart: new Date(Date.UTC(2015, 3, 24)), dstEnd: new Date(Date.UTC(2015, 8, 25, 2)) }; timezones[19] = { code: 'EAT', name: 'GMT +3:00 - Eastern African Time (EAT)', gmtOffset: 3 }; timezones[20] = { code: 'MET', name: 'GMT +3:30 - Middle East Time (MET)', gmtOffset: 3.5 }; timezones[21] = { code: 'NET', name: 'GMT +4:00 - Near East Time (NET)', gmtOffset: 4 }; timezones[22] = { code: 'PLT', name: 'GMT +5:00 - Pakistan Lahore Time (PLT)', gmtOffset: 5 }; timezones[23] = { code: 'IST', name: 'GMT +5:30 - India Standard Time (IST)', gmtOffset: 5.5 }; timezones[24] = { code: 'BST', name: 'GMT +6:00 - Bangladesh Standard Time (BST)', gmtOffset: 6 }; timezones[25] = { code: 'VST', name: 'GMT +7:00 - Vietnam Standard Time (VST)', gmtOffset: 7 }; timezones[26] = { code: 'CTT', name: 'GMT +8:00 - China Taiwan Time (CTT)', gmtOffset: 8 }; timezones[27] = { code: 'JST', name: 'GMT +9:00 - Japan Standard Time (JST)', gmtOffset: 9 }; timezones[28] = { code: 'ACT', name: 'GMT +9:30 - Australia Central Time (ACT)', gmtOffset: 9.5 }; timezones[29] = { code: 'AET', name: 'GMT +10:00 - Australia Eastern Time (AET)', gmtOffset: 10 }; timezones[30] = { code: 'SST', name: 'GMT +11:00 - Solomon Standard Time (SST)', gmtOffset: 11 }; timezones[31] = { code: 'NST', name: 'GMT +12:00 - New Zealand Standard Time (NST)', gmtOffset: 12, dstStart: new Date(Date.UTC(2015, 9, 4, 2)), dstEnd: new Date(Date.UTC(2016, 2, 20, 3)) }; timezones[32] = { code: 'PXT', name: 'GMT -8:00 - Mexico/Pacific Standard Time (PXT)', gmtOffset: -8, dstStart: new Date(Date.UTC(2015, 3, 5, 2)), dstEnd: new Date(Date.UTC(2015, 9, 25, 2)) }; timezones[33] = { code: 'MXT', name: 'GMT -7:00 - Mexico/Mountain Standard Time (MXT)', gmtOffset: -7, dstStart: new Date(Date.UTC(2015, 3, 5, 2)), dstEnd: new Date(Date.UTC(2015, 9, 25, 2)) }; timezones[34] = { code: 'CXT', name: 'GMT -6:00 - Mexico/Central Standard Time (CXT)', gmtOffset: -6, dstStart: new Date(Date.UTC(2015, 3, 5, 2)), dstEnd: new Date(Date.UTC(2015, 9, 25, 2)) }; export enum DateIntervals { second, minute, hour, day, week, month, quarter, year } // Return an id from a timezone code or id. Return -1 if not found. export function getTimezoneId(timezone: any): number { if (typeof timezone == 'string') { // like PST or GMT timezone = timezone.toUpperCase(); for (var i = 1; i < 35; i++) { if (timezones[i].code == timezone) return i; } return -1; // not found } else { return timezone; } } // The current timezone offset in seconds that adjusts for DST. export function gmtOffset(timezoneId: number) { var timezone = timezones[this.getTimezoneId(timezoneId)]; // calculate the seconds off from GMT and adjust match var tzOffset = timezone.gmtOffset * 3600; var useDate = new Date(); useDate = addSeconds(tzOffset, useDate); // adjust value for daylight savings time if (timezone.dstStart) { if (useDate.getTime() >= timezone.dstStart.getTime() && useDate.getTime() < timezone.dstEnd.getTime()) return tzOffset + 3600; } return tzOffset; } export function currentDatetime(gmtOffset: number = 0) { var date = new Date(); return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds() + gmtOffset)); } export function toUTCFromDate(date: Date) { return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds() + date.getTimezoneOffset() * 60)); } export function toUTC(strDate: string, gmtOffset: number = 0) { var date = new Date(Date.parse(strDate)); return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds() + gmtOffset)); } export function currentDate(gmtOffset: number = 0) { var date = new Date(); if (gmtOffset == 0) { return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate())); } var adjustedDate = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds() + gmtOffset)); return new Date(Date.UTC(adjustedDate.getUTCFullYear(), adjustedDate.getUTCMonth(), adjustedDate.getUTCDate())); } // Format a date into yyyy-mm-dd hh:mm:ss. If the date has no epoch component, return in the format yyyy-mm-dd export function dateToString(date: Date, includeTime: boolean = true): string { var day = date.getUTCDate(); var month = date.getUTCMonth() + 1; var hour = date.getUTCHours(); var minute = date.getUTCMinutes(); var second = date.getUTCSeconds(); var ret = date.getUTCFullYear() + '-' + (month <= 9 ? '0' + month.toString() : month.toString()) + '-' + (day <= 9 ? '0' + day.toString() : day.toString()); if (includeTime && (hour != 0 || minute != 0 || second != 0)) ret += ' ' + (hour <= 9 ? '0' + hour.toString() : hour.toString()) + ":" + (minute <= 9 ? '0' + minute.toString() : minute.toString()) + ':' + (second <= 9 ? '0' + second.toString() : second.toString()); return ret; } // Add a number of days to a date. The base date defaults to the epoch start. export function addDays(days: number, date?: Date) { if (!date) date = start(); return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate() + days)); } // Add a number of seconds to a date. The base date defaults to the epoch start. export function startOfDate(date?: Date) { if (!date) date = start(); return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 0, 0, 0)); } // Add a number of seconds to a date. The base date defaults to the epoch start. export function addSeconds(seconds: number, date?: Date) { if (!date) date = start(); return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds() + seconds)); } // Return the difference in intervals between two dates. If the second date is not passed in, the start date // defaults to 1999-01-01. export function diff(interval: DateIntervals, date1: Date, date2?: Date): number { if (!date2) { date2 = date1; date1 = start(); } // convert to utc seconds from 1999-01-01 switch (interval) { case DateIntervals.second: return second(date2) - second(date1); case DateIntervals.minute: return minute(date2) - minute(date1); case DateIntervals.hour: return hour(date2) - hour(date1); case DateIntervals.day: return day(date2) - day(date1); case DateIntervals.week: return week(date2) - week(date1); case DateIntervals.month: return month(date2) - month(date1); case DateIntervals.quarter: return quarter(date2) - quarter(date1); case DateIntervals.year: return date2.getUTCFullYear() - date1.getUTCFullYear(); } } /** * * Get date elements in timeframes since 1999, in UTC. The following routines all assume * that standard. * */ // ALL epoch intervals (except year) are from 1999-01-01 export function start(): Date { return new Date(Date.UTC(1999, 0, 1)); } // Return milliseconds from 1999-01-01 export function millisecond(date?: Date) { if (!date) date = new Date(); var msFromEpoch: number = date.getTime(); return msFromEpoch - 915148800000; // convert to utc milliseconds from 1999-01-01 } // Return seconds from 1999-01-01 export function second(date?: Date) { if (!date) date = new Date(); var secondsFromEpoch: number = date.getTime() / 1000; return Math.round(secondsFromEpoch) - 915148800; // convert to utc seconds from 1999-01-01 } // Return minutes from 1999-01-01 export function minute(date?: Date) { if (!date) date = new Date(); // strip off secs off dates var date1 = start(); var date2 = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes())); var seconds1: number = Math.round(date1.getTime() / 1000) - 915148800; var seconds2: number = Math.round(date2.getTime() / 1000) - 915148800; return Math.round((seconds2 - seconds1) / 60); } // Return hours from 1999-01-01 export function hour(date?: Date) { if (!date) date = new Date(); // strip off minutes/secs off dates var date1 = start(); var date2 = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours())); var seconds1: number = Math.round(date1.getTime() / 1000) - 915148800; var seconds2: number = Math.round(date2.getTime() / 1000) - 915148800; return Math.round((seconds2 - seconds1) / 3600); } // Return days from 1999-01-01 export function day(date?: Date) { if (!date) date = new Date(); // strip off hours/minutes/secs off dates var date1 = start(); var date2 = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate())); var seconds1: number = Math.round(date1.getTime() / 1000) - 915148800; var seconds2: number = Math.round(date2.getTime() / 1000) - 915148800; return Math.floor((seconds2 - seconds1) / 3600 / 24); } // Return weeks from 1999-01-01 export function week(date?: Date) { if (!date) date = new Date(); var date1 = start(); var seconds1: number = Math.round(date1.getTime() / 1000) - 915148800 - (24 * 3600 * 5); var seconds2: number = Math.round(date.getTime() / 1000) - 915148800; return Math.floor((seconds2 - seconds1) / 3600 / 24 / 7); } // Return months from 1999-01-01 export function month(date?: Date) { if (!date) date = new Date(); var date1 = start(); return (date.getUTCFullYear() - date1.getUTCFullYear()) * 12 + (date.getUTCMonth() - date1.getUTCMonth()); } // Return quarters from 1999-01-01 export function quarter(date?: Date) { if (!date) date = new Date(); var date1 = start(); var q1 = Math.floor(date1.getMonth() / 4); var q2 = Math.floor(date.getMonth() / 4); return (date.getUTCFullYear() - date1.getUTCFullYear()) * 4 + (q2 - q1); } // Convert a timezone description or id into a formatted timezone id export function formatTimezone(param: string) { var timezoneId: string = 'PST'; // get timezone if (param) { // pull timezone id out of timezone description if (param.indexOf('(') > -1) { timezoneId = param.substr(param.indexOf('(') + 1, 3).toUpperCase(); } else { timezoneId = param; } } var timezoneFound = false; // validate timezone for (var i = 0; i < epoch.timezones.length; i++) { if (epoch.timezones[i + 1].code == timezoneId) { timezoneFound = true; break; } } if (!timezoneFound) { timezoneId = null; // indicates error } return timezoneId; }