Skip to main content
taralee02
Participating Frequently
May 24, 2018
Question

Time Hours Calculation in Acrobat Pro X

  • May 24, 2018
  • 1 reply
  • 1702 views

Customer asked how to make it calculate. It was summing the hours up, but not adding it as time. I don't know much about this, customer created this on her own. We don't have anybody at our company that does this. There is some JavaScript code in there to do the calculation, but I have no idea how I know if there is a problem with it and how to make it work and calculate properly. Any help much appreciated! Thank you!

Before I messed with it and added the last time to see if it was working and how, it has 6.9 in there to total up the top 3.

I noticed there is just no code for the total field. All the other Total hours Fields had a section of that JavaScript code below, but the bottom Total hours for day didn't have JavaScript math in it which is why it's not working. The customer did have Sum selected which is why it was adding them wrong. I took that off, but I have no idea how to put a calculation in that field. I mean what the JavaScript Calculation should be. Hoping somebody could be of help. Thanks!

This is the code in there for the Total Hours box:(Assuming I am doing this right, went to JavaScript and clicked Edit all JavaScripts.)

//-------------------------------------------------------------
//-----------------Do not edit the XML tags--------------------
//-------------------------------------------------------------

//<AcroForm>
//<ACRO_source>total hoursRow1:Calculate</ACRO_source>
//<ACRO_script>
/*********** belongs to: AcroForm:total hoursRow1:Calculate ***********/
   event.value = "";
   var inTimeField = this.getField("start timeRow1");
   var inTime = inTimeField.value;
   var outTimeField = this.getField("enD timeRow1");
   var outTime = outTimeField.value;
   if (inTime!="" && outTime!="") {
    var inTimeDate = util.scand("mm-dd-yyyy HH:MM", "01-01-2012 " + inTime);
    var outTimeDate = util.scand("mm-dd-yyyy HH:MM", "01-01-2012 " + outTime);
    if (inTimeDate!=null && outTimeDate!=null) {
     if (inTimeDate.getTime()>outTimeDate.getTime()) {
      //console.println("Error: " + inTimeField.name + " is before " + outTimeField.name);
      outTimeDate.setTime(outTimeDate.getTime()+86400000);
     }     var totalTimeInMins = (outTimeDate.getTime() - inTimeDate.getTime()) / 60000;
     var totalTime_hours = Math.floor(totalTimeInMins / 60);
     var totalTime_mins = Math.floor(totalTimeInMins % 60);
     var totalTime_minsString = totalTime_mins<10 ? "0"+totalTime_mins : ""+totalTime_mins;
     event.value = totalTime_hours + ":" + totalTime_minsString;
    }
   }
//</ACRO_script>
//</AcroForm>

//<AcroForm>
//<ACRO_source>total hoursRow10:Calculate</ACRO_source>
//<ACRO_script>
/*********** belongs to: AcroForm:total hoursRow10:Calculate ***********/
   event.value = "";
   var inTimeField = this.getField("start timeRow10");
   var inTime = inTimeField.value;
   var outTimeField = this.getField("enD timeRow10");
   var outTime = outTimeField.value;
   if (inTime!="" && outTime!="") {
    var inTimeDate = util.scand("mm-dd-yyyy HH:MM", "01-01-2012 " + inTime);
    var outTimeDate = util.scand("mm-dd-yyyy HH:MM", "01-01-2012 " + outTime);
    if (inTimeDate!=null && outTimeDate!=null) {
     if (inTimeDate.getTime()>outTimeDate.getTime()) {
      //console.println("Error: " + inTimeField.name + " is before " + outTimeField.name);
      outTimeDate.setTime(outTimeDate.getTime()+86400000);
     }     var totalTimeInMins = (outTimeDate.getTime() - inTimeDate.getTime()) / 60000;
     var totalTime_hours = Math.floor(totalTimeInMins / 60);
     var totalTime_mins = Math.floor(totalTimeInMins % 60);
     var totalTime_minsString = totalTime_mins<10 ? "0"+totalTime_mins : ""+totalTime_mins;
     event.value = totalTime_hours + ":" + totalTime_minsString;
    }
   }
//</ACRO_script>
//</AcroForm>

//<AcroForm>
//<ACRO_source>total hoursRow11:Calculate</ACRO_source>
//<ACRO_script>
/*********** belongs to: AcroForm:total hoursRow11:Calculate ***********/
   event.value = "";
   var inTimeField = this.getField("start timeRow11");
   var inTime = inTimeField.value;
   var outTimeField = this.getField("enD timeRow11");
   var outTime = outTimeField.value;
   if (inTime!="" && outTime!="") {
    var inTimeDate = util.scand("mm-dd-yyyy HH:MM", "01-01-2012 " + inTime);
    var outTimeDate = util.scand("mm-dd-yyyy HH:MM", "01-01-2012 " + outTime);
    if (inTimeDate!=null && outTimeDate!=null) {
     if (inTimeDate.getTime()>outTimeDate.getTime()) {
      //console.println("Error: " + inTimeField.name + " is before " + outTimeField.name);
      outTimeDate.setTime(outTimeDate.getTime()+86400000);
     }     var totalTimeInMins = (outTimeDate.getTime() - inTimeDate.getTime()) / 60000;
     var totalTime_hours = Math.floor(totalTimeInMins / 60);
     var totalTime_mins = Math.floor(totalTimeInMins % 60);
     var totalTime_minsString = totalTime_mins<10 ? "0"+totalTime_mins : ""+totalTime_mins;
     event.value = totalTime_hours + ":" + totalTime_minsString;
    }
   }
//</ACRO_script>
//</AcroForm>

//<AcroForm>
//<ACRO_source>total hoursRow2:Calculate</ACRO_source>
//<ACRO_script>
/*********** belongs to: AcroForm:total hoursRow2:Calculate ***********/
   event.value = "";
   var inTimeField = this.getField("start timeRow2");
   var inTime = inTimeField.value;
   var outTimeField = this.getField("enD timeRow2");
   var outTime = outTimeField.value;
   if (inTime!="" && outTime!="") {
    var inTimeDate = util.scand("mm-dd-yyyy HH:MM", "01-01-2012 " + inTime);
    var outTimeDate = util.scand("mm-dd-yyyy HH:MM", "01-01-2012 " + outTime);
    if (inTimeDate!=null && outTimeDate!=null) {
     if (inTimeDate.getTime()>outTimeDate.getTime()) {
      //console.println("Error: " + inTimeField.name + " is before " + outTimeField.name);
      outTimeDate.setTime(outTimeDate.getTime()+86400000);
     }     var totalTimeInMins = (outTimeDate.getTime() - inTimeDate.getTime()) / 60000;
     var totalTime_hours = Math.floor(totalTimeInMins / 60);
     var totalTime_mins = Math.floor(totalTimeInMins % 60);
     var totalTime_minsString = totalTime_mins<10 ? "0"+totalTime_mins : ""+totalTime_mins;
     event.value = totalTime_hours + ":" + totalTime_minsString;
    }
   }
//</ACRO_script>
//</AcroForm>

//<AcroForm>
//<ACRO_source>total hoursRow3:Calculate</ACRO_source>
//<ACRO_script>
/*********** belongs to: AcroForm:total hoursRow3:Calculate ***********/
   event.value = "";
   var inTimeField = this.getField("start timeRow3");
   var inTime = inTimeField.value;
   var outTimeField = this.getField("enD timeRow3");
   var outTime = outTimeField.value;
   if (inTime!="" && outTime!="") {
    var inTimeDate = util.scand("mm-dd-yyyy HH:MM", "01-01-2012 " + inTime);
    var outTimeDate = util.scand("mm-dd-yyyy HH:MM", "01-01-2012 " + outTime);
    if (inTimeDate!=null && outTimeDate!=null) {
     if (inTimeDate.getTime()>outTimeDate.getTime()) {
      //console.println("Error: " + inTimeField.name + " is before " + outTimeField.name);
      outTimeDate.setTime(outTimeDate.getTime()+86400000);
     }     var totalTimeInMins = (outTimeDate.getTime() - inTimeDate.getTime()) / 60000;
     var totalTime_hours = Math.floor(totalTimeInMins / 60);
     var totalTime_mins = Math.floor(totalTimeInMins % 60);
     var totalTime_minsString = totalTime_mins<10 ? "0"+totalTime_mins : ""+totalTime_mins;
     event.value = totalTime_hours + ":" + totalTime_minsString;
    }
   }
//</ACRO_script>
//</AcroForm>

//<AcroForm>
//<ACRO_source>total hoursRow4:Calculate</ACRO_source>
//<ACRO_script>
/*********** belongs to: AcroForm:total hoursRow4:Calculate ***********/
   event.value = "";
   var inTimeField = this.getField("start timeRow4");
   var inTime = inTimeField.value;
   var outTimeField = this.getField("enD timeRow4");
   var outTime = outTimeField.value;
   if (inTime!="" && outTime!="") {
    var inTimeDate = util.scand("mm-dd-yyyy HH:MM", "01-01-2012 " + inTime);
    var outTimeDate = util.scand("mm-dd-yyyy HH:MM", "01-01-2012 " + outTime);
    if (inTimeDate!=null && outTimeDate!=null) {
     if (inTimeDate.getTime()>outTimeDate.getTime()) {
      //console.println("Error: " + inTimeField.name + " is before " + outTimeField.name);
      outTimeDate.setTime(outTimeDate.getTime()+86400000);
     }     var totalTimeInMins = (outTimeDate.getTime() - inTimeDate.getTime()) / 60000;
     var totalTime_hours = Math.floor(totalTimeInMins / 60);
     var totalTime_mins = Math.floor(totalTimeInMins % 60);
     var totalTime_minsString = totalTime_mins<10 ? "0"+totalTime_mins : ""+totalTime_mins;
     event.value = totalTime_hours + ":" + totalTime_minsString;
    }
   }
//</ACRO_script>
//</AcroForm>

//<AcroForm>
//<ACRO_source>total hoursRow5:Calculate</ACRO_source>
//<ACRO_script>
/*********** belongs to: AcroForm:total hoursRow5:Calculate ***********/
   event.value = "";
   var inTimeField = this.getField("start timeRow5");
   var inTime = inTimeField.value;
   var outTimeField = this.getField("enD timeRow5");
   var outTime = outTimeField.value;
   if (inTime!="" && outTime!="") {
    var inTimeDate = util.scand("mm-dd-yyyy HH:MM", "01-01-2012 " + inTime);
    var outTimeDate = util.scand("mm-dd-yyyy HH:MM", "01-01-2012 " + outTime);
    if (inTimeDate!=null && outTimeDate!=null) {
     if (inTimeDate.getTime()>outTimeDate.getTime()) {
      //console.println("Error: " + inTimeField.name + " is before " + outTimeField.name);
      outTimeDate.setTime(outTimeDate.getTime()+86400000);
     }     var totalTimeInMins = (outTimeDate.getTime() - inTimeDate.getTime()) / 60000;
     var totalTime_hours = Math.floor(totalTimeInMins / 60);
     var totalTime_mins = Math.floor(totalTimeInMins % 60);
     var totalTime_minsString = totalTime_mins<10 ? "0"+totalTime_mins : ""+totalTime_mins;
     event.value = totalTime_hours + ":" + totalTime_minsString;
    }
   }
//</ACRO_script>
//</AcroForm>

//<AcroForm>
//<ACRO_source>total hoursRow6:Calculate</ACRO_source>
//<ACRO_script>
/*********** belongs to: AcroForm:total hoursRow6:Calculate ***********/
   event.value = "";
   var inTimeField = this.getField("start timeRow6");
   var inTime = inTimeField.value;
   var outTimeField = this.getField("enD timeRow6");
   var outTime = outTimeField.value;
   if (inTime!="" && outTime!="") {
    var inTimeDate = util.scand("mm-dd-yyyy HH:MM", "01-01-2012 " + inTime);
    var outTimeDate = util.scand("mm-dd-yyyy HH:MM", "01-01-2012 " + outTime);
    if (inTimeDate!=null && outTimeDate!=null) {
     if (inTimeDate.getTime()>outTimeDate.getTime()) {
      //console.println("Error: " + inTimeField.name + " is before " + outTimeField.name);
      outTimeDate.setTime(outTimeDate.getTime()+86400000);
     }     var totalTimeInMins = (outTimeDate.getTime() - inTimeDate.getTime()) / 60000;
     var totalTime_hours = Math.floor(totalTimeInMins / 60);
     var totalTime_mins = Math.floor(totalTimeInMins % 60);
     var totalTime_minsString = totalTime_mins<10 ? "0"+totalTime_mins : ""+totalTime_mins;
     event.value = totalTime_hours + ":" + totalTime_minsString;
    }
   }
//</ACRO_script>
//</AcroForm>

//<AcroForm>
//<ACRO_source>total hoursRow7:Calculate</ACRO_source>
//<ACRO_script>
/*********** belongs to: AcroForm:total hoursRow7:Calculate ***********/
   event.value = "";
   var inTimeField = this.getField("start timeRow7");
   var inTime = inTimeField.value;
   var outTimeField = this.getField("enD timeRow7");
   var outTime = outTimeField.value;
   if (inTime!="" && outTime!="") {
    var inTimeDate = util.scand("mm-dd-yyyy HH:MM", "01-01-2012 " + inTime);
    var outTimeDate = util.scand("mm-dd-yyyy HH:MM", "01-01-2012 " + outTime);
    if (inTimeDate!=null && outTimeDate!=null) {
     if (inTimeDate.getTime()>outTimeDate.getTime()) {
      //console.println("Error: " + inTimeField.name + " is before " + outTimeField.name);
      outTimeDate.setTime(outTimeDate.getTime()+86400000);
     }     var totalTimeInMins = (outTimeDate.getTime() - inTimeDate.getTime()) / 60000;
     var totalTime_hours = Math.floor(totalTimeInMins / 60);
     var totalTime_mins = Math.floor(totalTimeInMins % 60);
     var totalTime_minsString = totalTime_mins<10 ? "0"+totalTime_mins : ""+totalTime_mins;
     event.value = totalTime_hours + ":" + totalTime_minsString;
    }
   }
//</ACRO_script>
//</AcroForm>

//<AcroForm>
//<ACRO_source>total hoursRow8:Calculate</ACRO_source>
//<ACRO_script>
/*********** belongs to: AcroForm:total hoursRow8:Calculate ***********/
   event.value = "";
   var inTimeField = this.getField("start timeRow8");
   var inTime = inTimeField.value;
   var outTimeField = this.getField("enD timeRow8");
   var outTime = outTimeField.value;
   if (inTime!="" && outTime!="") {
    var inTimeDate = util.scand("mm-dd-yyyy HH:MM", "01-01-2012 " + inTime);
    var outTimeDate = util.scand("mm-dd-yyyy HH:MM", "01-01-2012 " + outTime);
    if (inTimeDate!=null && outTimeDate!=null) {
     if (inTimeDate.getTime()>outTimeDate.getTime()) {
      //console.println("Error: " + inTimeField.name + " is before " + outTimeField.name);
      outTimeDate.setTime(outTimeDate.getTime()+86400000);
     }     var totalTimeInMins = (outTimeDate.getTime() - inTimeDate.getTime()) / 60000;
     var totalTime_hours = Math.floor(totalTimeInMins / 60);
     var totalTime_mins = Math.floor(totalTimeInMins % 60);
     var totalTime_minsString = totalTime_mins<10 ? "0"+totalTime_mins : ""+totalTime_mins;
     event.value = totalTime_hours + ":" + totalTime_minsString;
    }
   }
//</ACRO_script>
//</AcroForm>

//<AcroForm>
//<ACRO_source>total hoursRow9:Calculate</ACRO_source>
//<ACRO_script>
/*********** belongs to: AcroForm:total hoursRow9:Calculate ***********/
   event.value = "";
   var inTimeField = this.getField("start timeRow9");
   var inTime = inTimeField.value;
   var outTimeField = this.getField("enD timeRow9");
   var outTime = outTimeField.value;
   if (inTime!="" && outTime!="") {
    var inTimeDate = util.scand("mm-dd-yyyy HH:MM", "01-01-2012 " + inTime);
    var outTimeDate = util.scand("mm-dd-yyyy HH:MM", "01-01-2012 " + outTime);
    if (inTimeDate!=null && outTimeDate!=null) {
     if (inTimeDate.getTime()>outTimeDate.getTime()) {
      //console.println("Error: " + inTimeField.name + " is before " + outTimeField.name);
      outTimeDate.setTime(outTimeDate.getTime()+86400000);
     }     var totalTimeInMins = (outTimeDate.getTime() - inTimeDate.getTime()) / 60000;
     var totalTime_hours = Math.floor(totalTimeInMins / 60);
     var totalTime_mins = Math.floor(totalTimeInMins % 60);
     var totalTime_minsString = totalTime_mins<10 ? "0"+totalTime_mins : ""+totalTime_mins;
     event.value = totalTime_hours + ":" + totalTime_minsString;
    }
   }
//</ACRO_script>
//</AcroForm>

This topic has been closed for replies.

1 reply

Inspiring
May 24, 2018

There have been many examples posted to this forum, you can search to find them. There are easier ways to code the problem by using document level functions to perform the repeated tasks, like converting time string fields to date object values and then to a numeric value with a common base value. The task can also be made easier by using hierarchical field names.

A review of the calculations shows that all time differences are being calculated for January 1, 2012. This is a serious flaw if the date and time period covers the interval when there is a change in Day Light Savings time or BST, British Summer Time? I expect the calculation will be wrong by 1 hour.

taralee02
taralee02Author
Participating Frequently
May 29, 2018

I see the 2012 in the code though. I can just change that to 2018? I am assuming customer must have copied this code from somewhere.

Inspiring
May 30, 2018

The customer entered the date string "01-01-2012" just to have a required date value for processing.

The choice of calculation for the total hours, uses some behind the scenes JavaScript to convert the "numeric" values, actually hours and minutes, and sums them like decimal values.

1.3 + 3.3 + 2.3 =  6.9 not the 7 hours 30 minutes that one would expect.

JavaScript's smallest unit of time measurement is the millisecond or 1/1000 of a second. And using the "new Date()" method or the "util.scand()" method will create a date object whose value is the number of 1/1000 seconds since January 1, 1970. This value can be converted to minutes by dividing the value by 1,000 to get the number of seconds and then by 60 seconds / minute. Taking difference of the end and start date time combinations will provide the difference between the 2 times in minutes.

If each of the fields for individual intervals is reported as the difference in minutes, then one only needs to sum the individual differences fields. A nice feature of Acrobat forms is that the formatting applied to a field only affects the displayed or seen value. So one can write a custom format script that converts any number of minutes into the format of Hours:Minutes.

With time calculations I have found that using a function or reusable block of code to convert date and time values into minutes and a function to convert minutes to Hours:Minutes makes the coding for individual forms appear less complex..