Script Includes
Date/Time Utilities
Reusable functions for date and time calculations and formatting.
var DateTimeUtils = Class.create();
DateTimeUtils.prototype = {
/**
* Add business days to a date (excludes weekends and holidays)
*
* @param {GlideDateTime} startDate - Starting date
* @param {number} days - Number of business days to add
* @param {string} scheduleId - (Optional) sys_id of schedule to use
* @returns {GlideDateTime} Calculated date
*/
addBusinessDays: function(startDate, days, scheduleId) {
if (!startDate || !days) {
return startDate;
}
var schedule;
if (scheduleId) {
schedule = new GlideSchedule(scheduleId);
} else {
// Use default 8-5 schedule (sys_id for "8-5 weekdays excluding holidays")
schedule = new GlideSchedule('c6a2389e0a0a0b9b006cfc04227be354');
}
var gdt = new GlideDateTime(startDate);
var duration = new GlideDuration(days * 24 * 60 * 60 * 1000); // Convert days to ms
var endDate = schedule.add(gdt, duration);
return endDate;
},
/**
* Calculate business days between two dates
*
* @param {GlideDateTime} startDate - Start date
* @param {GlideDateTime} endDate - End date
* @param {string} scheduleId - (Optional) sys_id of schedule to use
* @returns {number} Number of business days
*/
getBusinessDaysBetween: function(startDate, endDate, scheduleId) {
if (!startDate || !endDate) {
return 0;
}
var schedule;
if (scheduleId) {
schedule = new GlideSchedule(scheduleId);
} else {
schedule = new GlideSchedule('c6a2389e0a0a0b9b006cfc04227be354');
}
var duration = schedule.duration(startDate, endDate);
var days = duration.getDayPart();
var hours = duration.getHourPart();
// Convert to decimal days
var totalDays = days + (hours / 24);
return totalDays;
},
/**
* Format date to user-friendly string
*
* @param {GlideDateTime} dateTime - Date to format
* @param {string} format - Format type: 'short', 'long', 'time', 'datetime'
* @returns {string} Formatted date string
*/
formatDate: function(dateTime, format) {
if (!dateTime) {
return '';
}
var gdt = new GlideDateTime(dateTime);
format = format || 'short';
switch(format) {
case 'short':
// MM/DD/YYYY
return gdt.getDisplayValue().split(' ')[0];
case 'long':
// Month DD, YYYY
return gdt.getByFormat('MMMM dd, yyyy');
case 'time':
// HH:MM AM/PM
return gdt.getByFormat('hh:mm a');
case 'datetime':
// MM/DD/YYYY HH:MM AM/PM
return gdt.getByFormat('MM/dd/yyyy hh:mm a');
case 'iso':
// ISO 8601 format
return gdt.getValue();
default:
return gdt.getDisplayValue();
}
},
/**
* Get relative time description (e.g., "2 hours ago", "in 3 days")
*
* @param {GlideDateTime} dateTime - Date to compare
* @returns {string} Relative time description
*/
getRelativeTime: function(dateTime) {
if (!dateTime) {
return '';
}
var now = new GlideDateTime();
var target = new GlideDateTime(dateTime);
var diff = gs.dateDiff(now.getValue(), target.getValue(), true); // in seconds
var absDiff = Math.abs(diff);
var isPast = diff > 0;
var prefix = isPast ? '' : 'in ';
var suffix = isPast ? ' ago' : '';
// Calculate time units
var seconds = absDiff;
var minutes = Math.floor(seconds / 60);
var hours = Math.floor(minutes / 60);
var days = Math.floor(hours / 24);
var weeks = Math.floor(days / 7);
var months = Math.floor(days / 30);
var years = Math.floor(days / 365);
// Determine appropriate unit
if (years > 0) {
return prefix + years + (years === 1 ? ' year' : ' years') + suffix;
} else if (months > 0) {
return prefix + months + (months === 1 ? ' month' : ' months') + suffix;
} else if (weeks > 0) {
return prefix + weeks + (weeks === 1 ? ' week' : ' weeks') + suffix;
} else if (days > 0) {
return prefix + days + (days === 1 ? ' day' : ' days') + suffix;
} else if (hours > 0) {
return prefix + hours + (hours === 1 ? ' hour' : ' hours') + suffix;
} else if (minutes > 0) {
return prefix + minutes + (minutes === 1 ? ' minute' : ' minutes') + suffix;
} else {
return 'just now';
}
},
/**
* Check if date is within business hours
*
* @param {GlideDateTime} dateTime - Date to check
* @param {string} scheduleId - (Optional) sys_id of schedule to use
* @returns {boolean} True if within business hours
*/
isBusinessHours: function(dateTime, scheduleId) {
if (!dateTime) {
return false;
}
var schedule;
if (scheduleId) {
schedule = new GlideSchedule(scheduleId);
} else {
schedule = new GlideSchedule('c6a2389e0a0a0b9b006cfc04227be354');
}
return schedule.isInSchedule(dateTime);
},
/**
* Get the next business day
*
* @param {GlideDateTime} startDate - Starting date (defaults to now)
* @returns {GlideDateTime} Next business day
*/
getNextBusinessDay: function(startDate) {
var gdt = startDate ? new GlideDateTime(startDate) : new GlideDateTime();
// Add one day at a time until we find a business day
var maxAttempts = 10; // Prevent infinite loop
var attempts = 0;
do {
gdt.addDaysLocalTime(1);
var dayOfWeek = gdt.getDayOfWeekLocalTime();
attempts++;
// 1 = Sunday, 7 = Saturday
if (dayOfWeek !== 1 && dayOfWeek !== 7) {
return gdt;
}
} while (attempts < maxAttempts);
return gdt;
},
type: 'DateTimeUtils'
};How to use it
1. Create a new Script Include 2. Set Name to "DateTimeUtils" 3. Leave "Client callable" unchecked 4. Copy the code above 5. Call from Business Rules, other Script Includes, or Background Scripts
Adapt the table names, fields, and conditions to your instance. Test the behavior in a development environment before using it in production.