UNPKG

delphirtl

Version:
269 lines 19.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.fromBlockchainTimestamp = fromBlockchainTimestamp; exports.getEstimatedBlockNumberForDuration = getEstimatedBlockNumberForDuration; exports.JSDateAddYears = JSDateAddYears; exports.JSDateAddMonths = JSDateAddMonths; exports.JSDateAddWeeks = JSDateAddWeeks; exports.JSDateAddDays = JSDateAddDays; exports.JSDateAddHours = JSDateAddHours; exports.JSDateAddMins = JSDateAddMins; exports.JSDateAddSecs = JSDateAddSecs; exports.JSTimeToUTC = JSTimeToUTC; exports.JSDateToBlockchainTimestamp = JSDateToBlockchainTimestamp; exports.DiffDuration = DiffDuration; exports.isValidDate = isValidDate; exports.toFormat = toFormat; exports.FormatDateTime = toFormat; const console_1 = require("console"); /** * Converts the given time into Javascript Date * @param time * @returns */ function fromBlockchainTimestamp(time) { const timestamp = time * 1000; const result = new global.Date(timestamp); return result; } Date.prototype.ToBlockchainTimestamp = function () { const timestamp = this.getTime(); // in seconds const result = Math.floor((timestamp) / 1000); return result; }; /** * Returns a new instance of Date with the added number of seconds */ Date.prototype.addSeconds = function (seconds) { const result = new Date(this); result.setSeconds(result.getSeconds() + seconds); return result; }; /** * Returns a new instance of Date with the added number of minutes */ Date.prototype.addMinutes = function (minutes) { const result = new Date(this); result.setMinutes(result.getMinutes() + minutes); return result; }; /** * Returns a new instance of Date with the added number of hours */ Date.prototype.addHours = function (hours) { const result = new Date(this); result.setHours(result.getHours() + hours); return result; }; /** * Returns a new instance of Date with the added number of days */ Date.prototype.addDays = function (days) { const result = new Date(this); result.setDate(result.getDate() + days); return result; }; /** * Returns a new instance of Date with the added number of weeks */ Date.prototype.addWeeks = function (weeks) { const newDate = new Date(this); const result = newDate.addDays(weeks * 7); return result; }; /** * Returns a new instance of Date with the added number of months (30 days per month) */ Date.prototype.addMonths = function (months) { const newDate = new Date(this); const result = newDate.addDays(months * 30); return result; }; /** * Returns a new instance of Date with the added number of years */ Date.prototype.addYears = function (years) { const result = new Date(this); var dt = result.getDate(); result.setFullYear(result.getFullYear() + years); var currDt = result.getDate(); if (dt !== currDt) { result.addDays(-currDt); } return result; }; Date.prototype.isValidDate = function () { const result = this instanceof Date && !isNaN(this.valueOf()); return result; }; Date.prototype.toFormat = function (format) { const result = toFormat(format, this); return result; }; /** * @param {Date} date * @param {number} years * @returns Date */ function JSDateAddYears(date, years) { const result = date.addYears(years); return result; } function JSDateAddMonths(date, months) { const result = date.addMonths(months); return result; } function JSDateAddWeeks(date, weeks) { const result = date.addWeeks(weeks); return result; } /** * @param {Date} time * @param {number} days * @returns Date */ function JSDateAddDays(time, days) { const result = time.addDays(days); return result; } /** * @param {Date} time * @param {number} hours * @returns Date */ function JSDateAddHours(time, hours) { const result = time.addHours(hours); return result; } /** * @param {Date} time * @param {number} mins * @returns Date */ function JSDateAddMins(time, mins) { const result = time.addMinutes(mins); return result; } function JSDateAddSecs(time, secs) { const result = time.addSeconds(secs); return result; } // Converts Javascript date/time to Blockchain date/time, converting to UTC as well. /** * @param {number|Date} time * @returns number */ function JSDateToBlockchainTimestamp(time) { let timestamp; if (time instanceof global.Date) { // adjust to UTC let tzoffsetHours = time.getTimezoneOffset(); timestamp = time.getTime(); // in seconds } else { // assume already in UTC timestamp = time; } const result = Math.floor((timestamp) / 1000); return result; } /** * @param {number} time * @returns number */ function JSTimeToUTC(time) { return time; } function getEstimatedBlockNumberForDuration(Block1, Block2, timestampInMS) { const diffBlockNumber = Math.abs(Block1.number - Block2.number); const diffTimestamp = Math.abs(Block1.timestamp - Block2.timestamp) * 1000; const result = timestampInMS / (diffTimestamp / diffBlockNumber); return result; } /** * Calculates the difference between 2 dates * @param d1 * @param d2 * @returns */ function DiffDuration(d1, d2) { const msDiff = Math.abs(d1.getTime() - d2.getTime()); const totalSeconds = Math.floor(msDiff / 1000); const totalMinutes = Math.floor(totalSeconds / 60); const totalHours = Math.floor(totalMinutes / 60); const totalDays = Math.floor(totalHours / 24); let years = Math.floor(totalDays / 365); let remainingDays = totalDays % 365; let months = Math.floor(remainingDays / 30); remainingDays = remainingDays % 30; const hours = totalHours % 24; const minutes = totalMinutes % 60; const seconds = totalSeconds % 60; return { years, months, days: remainingDays, hours, minutes, seconds }; } /** * Checks if a date is valid * * @param {Date} date * @returns {boolean} */ function isValidDate(date) { const result = date.isValidDate(); return result; } /** * Returns a string for the date in the given format\ 'YYYY': Full year (e.g., 2024)\ 'YY': Last two digits of year (e.g., 24)\ 'MMMM': January to December\ 'MMM': Jan to Dec\ 'MM': Month with leading zero (e.g., 01 - 12)\ 'M': Month without leading zero (e.g., 1 - 12)\ 'DD': Day with leading zero (e.g., 01 - 31)\ 'D': Day without leading zero (e.g., 1 - 31)\ 'HH': Hour in 24-hour format with leading zero (e.g., 00 - 23)\ 'H': Hour in 24-hour format without leading zero (e.g., 0 - 23)\ 'hh': Hour in 12-hour format with leading zero (e.g., 01 - 12)\ 'h': Hour in 12-hour format without leading zero (e.g., 1 - 12)\ 'nn': Minute with leading zero (e.g., 00 - 59)\ 'n': Minute without leading zero (e.g., 0 - 59)\ 'ss': Second with leading zero (e.g., 00 - 59)\ 's': Second without leading zero (e.g., 0 - 59)\ * * * @param {Date} d date instance * @param {string} format string format * @returns {string} */ function toFormat(format, d) { (0, console_1.assert)(d.isValidDate(), 'date instance is invalid!'); const padZero = (value, length) => String(value).padStart(length, '0'); const hour = d.getHours(); const isPM = hour >= 12; const monthsAbbr = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; const monthsFull = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; const replacements = { 'YYYY': d.getFullYear().toString(), // Full year (e.g., 2024) 'YY': d.getFullYear().toString().slice(-2), // Last two digits of year (e.g., 24) 'MMMM': monthsFull[d.getMonth()], // Full month name (e.g., January - December) 'MMM': monthsAbbr[d.getMonth()], // Abbreviated month name (e.g., Jan - Dec) 'MM': padZero(d.getMonth() + 1, 2), // Month with leading zero (e.g., 01 - 12) 'M': (d.getMonth() + 1).toString(), // Month without leading zero (e.g., 1 - 12) 'DD': padZero(d.getDate(), 2), // Day with leading zero (e.g., 01 - 31) 'D': d.getDate().toString(), // Day without leading zero (e.g., 1 - 31) 'HH': padZero(hour, 2), // 24-hour format with leading zero (e.g., 00 - 23) 'H': hour.toString(), // 24-hour format without leading zero (e.g., 0 - 23) 'hh': padZero(hour % 12 || 12, 2), // 12-hour format with leading zero (e.g., 01 - 12) 'h': (hour % 12 || 12).toString(), // 12-hour format without leading zero (e.g., 1 - 12) 'nn': padZero(d.getMinutes(), 2), // Minute with leading zero (e.g., 00 - 59) 'n': d.getMinutes().toString(), // Minute without leading zero (e.g., 0 - 59) 'ss': padZero(d.getSeconds(), 2), // Second with leading zero (e.g., 00 - 59) 's': d.getSeconds().toString(), // Second without leading zero (e.g., 0 - 59) 'AM': isPM ? 'PM' : 'AM', // AM/PM uppercase 'PM': isPM ? 'PM' : 'AM', // AM/PM uppercase 'am': isPM ? 'pm' : 'am', // am/pm lowercase 'pm': isPM ? 'pm' : 'am' // am/pm lowercase }; return format.replace(/YYYY|YY|MMMM|MMM|MM|M|DD|D|HH|H|hh|h|nn|n|ss|s|AM|PM|am|pm/g, match => replacements[match]); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2RhdGV1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTZZSSwwREFBdUI7QUFDdkIsZ0ZBQWtDO0FBQ2xDLHdDQUFjO0FBQ2QsMENBQWU7QUFDZix3Q0FBYztBQUNkLHNDQUFhO0FBQ2Isd0NBQWM7QUFDZCxzQ0FBYTtBQUNiLHNDQUFhO0FBQ2Isa0NBQVc7QUFDWCxrRUFBMkI7QUFDM0Isb0NBQVk7QUFDWixrQ0FBVztBQUNYLDRCQUFRO0FBQ0ksa0NBQWM7QUEzWjlCLHFDQUFpQztBQThGakM7Ozs7R0FJRztBQUNILFNBQVMsdUJBQXVCLENBQUMsSUFBWTtJQUN6QyxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQzlCLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMxQyxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsR0FBRztJQUNuQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxhQUFhO0lBQy9DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUM5QyxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDLENBQUE7QUFFRDs7RUFFRTtBQUNGLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLFVBQVUsT0FBZTtJQUNqRCxNQUFNLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQztJQUNqRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDLENBQUM7QUFFRjs7RUFFRTtB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