UNPKG

finmath-engine

Version:

Motor de cálculos financeiros de alta precisão para o mercado brasileiro

73 lines 2.43 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.daysBetween = daysBetween; exports.yearFraction = yearFraction; const decimal_js_1 = require("decimal.js"); /** * Calculate days between two dates using specified convention * * @param startDate - Start date (inclusive) * @param endDate - End date (exclusive) * @param convention - Day count convention to use * @returns Number of days according to convention * * @example * daysBetween(new Date('2025-01-01'), new Date('2025-02-01'), '30/360') // 30 * daysBetween(new Date('2025-01-01'), new Date('2025-02-01'), 'ACT/365') // 31 */ function daysBetween(startDate, endDate, convention) { if (convention === "30/360") { return days30_360(startDate, endDate); } // ACT/365 and ACT/360 use actual days return actualDays(startDate, endDate); } /** * Calculate year fraction between two dates * * @param startDate - Start date (inclusive) * @param endDate - End date (exclusive) * @param convention - Day count convention to use * @returns Year fraction as Decimal * * @example * yearFraction(new Date('2025-01-01'), new Date('2025-07-01'), 'ACT/365') * // Returns ~0.4959 (181 days / 365) */ function yearFraction(startDate, endDate, convention) { const days = daysBetween(startDate, endDate, convention); const divisor = convention === "ACT/360" ? 360 : 365; return new decimal_js_1.Decimal(days).div(divisor); } /** * Calculate actual days between dates (calendar days) */ function actualDays(startDate, endDate) { const start = new Date(startDate); const end = new Date(endDate); // Remove time component start.setHours(0, 0, 0, 0); end.setHours(0, 0, 0, 0); const diffMs = end.getTime() - start.getTime(); const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24)); return diffDays; } /** * Calculate days using 30/360 convention * Each month is considered to have 30 days */ function days30_360(startDate, endDate) { let y1 = startDate.getFullYear(); let m1 = startDate.getMonth() + 1; let d1 = startDate.getDate(); let y2 = endDate.getFullYear(); let m2 = endDate.getMonth() + 1; let d2 = endDate.getDate(); // Adjust day 31 to day 30 if (d1 === 31) d1 = 30; if (d2 === 31 && d1 >= 30) d2 = 30; return 360 * (y2 - y1) + 30 * (m2 - m1) + (d2 - d1); } //# sourceMappingURL=conventions.js.map