/* * Copyright (c) 2016-2017, Michael A. Updike All rights reserved. * Licensed under Apache 2.0 * https://opensource.org/licenses/Apache-2.0 * https://github.com/opus1269/chrome-extension-utils/blob/master/LICENSE.md */ { 'use strict'; new ExceptionHandler(); window.Chrome = window.Chrome || {}; /** * Time Class * @property {int} _hr - 24 hour time * @property {int} _min - minutes * @alias Chrome.Time */ Chrome.Time = class Time { /** * Create a new Time * @param {?string} [timeString=null] - in '00:00' format, if null * use current Date * @constructor */ constructor(timeString = null) { this._parse(timeString); } /** * Minutes in day * @returns {int} value * @static */ static get MIN_IN_DAY() { return 60 * 24; } /** * Milliseconds in day * @returns {int} value * @static */ static get MSEC_IN_DAY() { return Chrome.Time.MIN_IN_DAY * 60 * 1000; } /** * Determine if user wants 24 hr time * @param {?int} [frmt=null] - optional format, overrides storage value * @returns {boolean} true for 24 hour time * @private * @static */ static _is24Hr(frmt = null) { let ret = false; let format = Chrome.Storage.getInt('showTime', 0); if (frmt !== null) { format = frmt; } const localeTime = Chrome.Locale.localize('time_format'); if (format === 2) { // time display 24hr ret = true; } else if ((format === 0) && (localeTime === '24')) { // time display off, locale time 24 ret = true; } return ret; } /** * Convert string to current time * @param {!string} timeString - in '00:00' format * @returns {int} time in milliSeconds from epoch * @static */ static getTime(timeString) { const date = new Date(); const time = new Time(timeString); date.setHours(time._hr); date.setMinutes(time._min); date.setSeconds(0); date.setMilliseconds(0); return date.getTime(); } /** * Calculate time delta from now on a 24hr basis * @param {string} timeString - in '00:00' format * @returns {int} time delta in minutes * @static */ static getTimeDelta(timeString) { const curTime = Date.now(); const time = Chrome.Time.getTime(timeString); let delayMin = (time - curTime) / 1000 / 60; if (delayMin < 0) { delayMin = Chrome.Time.MIN_IN_DAY + delayMin; } return delayMin; } /** * Determine if current time is between start and stop, inclusive * @param {string} start - in '00:00' format * @param {string} stop - in '00:00' format * @returns {boolean} true if in the given range * @static */ static isInRange(start, stop) { const curTime = Date.now(); const startTime = Chrome.Time.getTime(start); const stopTime = Chrome.Time.getTime(stop); let ret = false; if (start === stop) { ret = true; } else if (stopTime > startTime) { if ((curTime >= startTime) && (curTime <= stopTime)) { ret = true; } } else { if ((curTime >= startTime) || (curTime <= stopTime)) { ret = true; } } return ret; } /** * Get time as string suitable for display, including AM/PM if 12hr * @param {!string} timeString - in '00:00' format * @param {?int} [frmt=null] - optional format, overrides storage value * @returns {!string} display string * @static */ static getStringFull(timeString, frmt = null) { const time = new Time(timeString); return time.toString(frmt); } /** * Get current time suitable for display w/o AM/PM if 12hr * @returns {!string} display string * @static */ static getStringShort() { const time = new Time(); let timeString = time.toString(); // strip off all non-digits but : timeString = timeString.replace(/[^\d:]/g, ''); // strip off everything after 'xx:xx' timeString = timeString.replace(/(.*?:.*?):.*/g, '$1'); return timeString; } /** * Parse time string * @param {string} timeString - in '00:00' format * @private */ _parse(timeString) { if (timeString === null) { const date = new Date(); this._hr = date.getHours(); this._min = date.getMinutes(); } else { this._hr = parseInt(timeString.substr(0, 2), 10); this._min = parseInt(timeString.substr(3, 2), 10); } } /** * Get string representation of Time * @param {?int} [frmt=null] - optional format, overrides storage value * @returns {string} As string */ toString(frmt = null) { const date = new Date(); date.setHours(this._hr, this._min); date.setSeconds(0); date.setMilliseconds(0); // fallback in case toLocaleTimeString fails - it does sometimes let ret = date.toTimeString(); const languages = []; if (typeof(navigator.language) !== 'undefined') { languages.push(navigator.language); } languages.push('en-US'); const opts = { hour: 'numeric', minute: '2-digit', hour12: !Time._is24Hr(frmt), }; try { ret = date.toLocaleTimeString(languages, opts); } catch (err) { Chrome.Utils.noop(); } return ret; } }; }