delphirtl
Version:
RTL functions from Delphi
269 lines • 19.4 kB
JavaScript
;
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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