Maintenance Window Formatting

by Alexey Ossikine

HTML

<label>Maintenance Window:</label>
<input type="text" name="maintenanceWindow" id="maintenanceWindow" value="fri:11:20-fri:11:50" />
<input type="button" value="convert" onclick="makeHumanReadable()" />
<br/>
<br/>
<label id="machineReadable"></label>
<br/>
<label id="humanReadable"></label>

JavaScript

function makeHumanReadable(){

  let maintWindow = document.getElementById("maintenanceWindow").value;
  let maintWindowExp = /([a-z]{3}):(\d{2}):(\d{2})-([a-z]{3}):(\d{2}):(\d{2})/g;
  let maintWindowParts = maintWindowExp.exec(maintWindow);
  let dayNumbers = {"sun": 0, "mon": 1, "tue": 2, "wed": 3, "thu": 4, "fri": 5, "sat": 6};

  let startTime = new Date();
  let endTime = new Date();

  //set the date by determining the next occurrence of the maintenance weekday (which could be today)
  startTime.setTime(startTime.getTime() + ((7 + dayNumbers[maintWindowParts[1]] - startTime.getDay()) % 7)*86400000);

  endTime.setTime(endTime.getTime() + ((7 + dayNumbers[maintWindowParts[4]] - endTime.getDay()) % 7)*86400000);

  //set the hours and minutes as well
  startTime.setHours(maintWindowParts[2], maintWindowParts[3], 0, 0);

  endTime.setHours(maintWindowParts[5], maintWindowParts[6], 0, 0);

  //if the hour and minute adjustment put us back into the past, add 7 days to make this the following week
  if(startTime.getTime() < Date.now()) startTime.setDate(startTime.getDate() + 7);

  if(endTime.getTime() < startTime.getTime()) endTime.setDate(endTime.getDate() + 7);

let options = { year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric'};

document.getElementById("machineReadable").innerHTML = "Machine readable: " + startTime.getTime() + " to " + endTime.getTime();

  document.getElementById("humanReadable").innerHTML = "Human readable: " + new Intl.DateTimeFormat('default', options).format(startTime) + " to " + new Intl.DateTimeFormat('default', options).format(endTime);

}

makeHumanReadable();