Skip to main content
Alexander-12
Participant
May 25, 2026
Answered

Assunto: Como calcular automaticamente horas trabalhadas no Adobe Acrobat usando JavaScript

  • May 25, 2026
  • 4 replies
  • 33 views

Olá pessoal,

Estou criando um formulário de folha de ponto no Adobe Acrobat e estou com dificuldade para calcular automaticamente as horas trabalhadas usando apenas campos de horário, sem utilizar datas.

O funcionário informa o horário de entrada, saída para almoço, retorno do almoço e saída final do expediente. Os horários são digitados no formato “h:mm tt”, como por exemplo 08:00 AM, 12:00 PM, 01:00 PM e 05:30 PM.

Preciso que o formulário calcule automaticamente as horas trabalhadas antes e depois do almoço, desconte o intervalo e mostre o total final em horas decimais.

Já tentei usar scripts personalizados no Acrobat e também utilizei:

event.value = util.printf("%,001.2f", event.value / 60);

mas ainda estou tendo problemas para converter corretamente os horários e somar tudo no resultado final.

Alguém teria um exemplo funcional em JavaScript para Acrobat que faça esse cálculo corretamente em uma folha de ponto diária?

Qualquer ajuda será muito bem-vinda.

    Correct answer Anand Sri Bhattacharya

    Hello ​@Alexander-12 

     

    I hope you are doing well, and thanks for reaching out. We’re sorry for the trouble you had.

     

    Please note that the following suggestions may or may not work, as the examples are a sample script and may need changes as per the current environment. 

     

    Observations and suggestions: 

    What's going wrong

    1. Time fields store strings, not numbers. A field formatted as Time holds a value like "08:00 AM". Doing event.value / 60 on a string returns NaN, which is why your final result never comes out right.
    2. The format token "h:mm tt" is wrong. Per Adobe's JavaScript for Acrobat API Reference, lowercase mm means month, not minutes. Minutes must be uppercase: "h:MM tt". Adobe uses this exact token in its own helpx examples (e.g., the dynamic-stamp date/time tutorial).
    3. No subtraction is being done. You need to parse each time into a Date object with util.scand, subtract, then convert milliseconds to decimal hours.

     

    Rename the four field names to match yours.

    (function () {
        var sIn       = this.getField("TimeIn").valueAsString;
        var sLunchOut = this.getField("LunchOut").valueAsString;
        var sLunchIn  = this.getField("LunchIn").valueAsString;
        var sOut      = this.getField("TimeOut").valueAsString;

        // If any field is empty, clear Total and stop
        if (sIn === "" || sLunchOut === "" || sLunchIn === "" || sOut === "") {
            event.value = "";
            return;
        }

        // "h:MM tt" — uppercase MM = minutes (lowercase mm would be month)
        var fmt = "h:MM tt";
        var dIn       = util.scand(fmt, sIn);
        var dLunchOut = util.scand(fmt, sLunchOut);
        var dLunchIn  = util.scand(fmt, sLunchIn);
        var dOut      = util.scand(fmt, sOut);

        // util.scand returns null if parsing fails — handle gracefully
        if (dIn == null || dLunchOut == null || dLunchIn == null || dOut == null) {
            event.value = "";
            return;
        }

        var msMorning   = dLunchOut.getTime() - dIn.getTime();
        var msAfternoon = dOut.getTime()      - dLunchIn.getTime();

        // Guard against negative spans (AM/PM entered incorrectly)
        if (msMorning < 0 || msAfternoon < 0) {
            event.value = "";
            return;
        }

        // ms → decimal hours (1000 × 60 × 60 = 3,600,000)
        var totalHours = (msMorning + msAfternoon) / 3600000;

        event.value = util.printf("%.2f", totalHours); // e.g. "8.50"
    })();

     

    A small note on testing: if you want to inspect what util.scand is returning, open All tools › Use JavaScript › Debugger (JavaScript Console) and run util.scand("h:MM tt", "08:00 AM") you should see a valid Date object.

     

    I hope this helps.

    Regards,

    Anand Sri.

    4 replies

    Alexander-12
    Participant
    May 25, 2026

    Obrigado pela explicação, Anand. Agora fez muito mais sentido para mim o motivo de o cálculo não estar funcionando como eu esperava no Acrobat.

    No começo eu realmente achei que seria algo simples, porque os horários já estavam formatados corretamente no formulário. Só depois da sua resposta percebi que o Acrobat ainda trata esses valores como texto e que precisava converter tudo com `util.scand()` antes de fazer qualquer cálculo.

    A parte do `h:MM tt` também esclareceu bastante coisa. Eu estava usando `mm` sem perceber que isso representava mês em vez de minutos, então provavelmente isso já estava quebrando parte do script desde o início.

    Gostei também da forma como você separou manhã e tarde antes de somar o total. Ficou bem mais fácil entender a lógica do desconto do almoço e da conversão para horas decimais.

    Os testes com validação de campos vazios e horários negativos também ajudaram bastante aqui. Em folha de ponto é muito fácil alguém preencher AM/PM errado ou esquecer algum horário.

    Enquanto eu fazia os testes do formulário, também comparei os resultados com uma calculadora de horas trabalhadas para conferir se os valores estavam corretos, e isso acabou ajudando bastante durante a validação.

    Agora consegui entender muito melhor como o Acrobat lida com horários no JavaScript. Obrigado novamente pela ajuda e pela explicação detalhada.

    jesse_5311
    Participating Frequently
    May 25, 2026

    Depois de ver a explicação completa do Anand, agora ficou bem mais fácil entender por que esse tipo de cálculo acaba dando problema no Acrobat mesmo quando a lógica parece simples no começo.

    O ponto principal é que os campos de horário não funcionam como números automaticamente. Mesmo aparecendo como hora no formulário, o Acrobat ainda trata valores como “08:00 AM” ou “05:30 PM” como texto até que eles sejam convertidos corretamente com util.scand().

    A parte do formato também é algo que pode confundir bastante. Eu mesmo não sabia que no Acrobat MM representa minutos e mm representa mês. Então usar h:MM tt acaba sendo essencial para o parser interpretar os horários corretamente.

    Outro detalhe importante no exemplo foi separar os períodos da manhã e da tarde antes de somar o total final. Isso deixa o cálculo mais confiável para folha de ponto porque o intervalo do almoço é descontado naturalmente sem precisar fazer ajustes manuais depois.

    Achei útil também a validação dos campos vazios e dos períodos negativos. Em formulários reais isso ajuda muito, principalmente quando alguém digita AM/PM errado ou deixa algum horário incompleto.

    No fim, a lógica acaba ficando mais ou menos assim:

    • converter os horários com util.scand()

    • transformar em objetos Date

    • calcular os intervalos em milissegundos

    • somar os períodos trabalhados

    • converter o resultado para horas decimais

    • formatar com util.printf()

    Seu tópico acabou sendo um ótimo exemplo de algo que parece básico em folha de ponto, mas que exige bastante cuidado dentro do JavaScript do Acrobat para funcionar corretamente.

    Anand Sri Bhattacharya
    Community Manager
    Community Manager
    May 25, 2026

    Hello ​@Alexander-12 

     

    I hope you are doing well, and thanks for reaching out. We’re sorry for the trouble you had.

     

    Please note that the following suggestions may or may not work, as the examples are a sample script and may need changes as per the current environment. 

     

    Observations and suggestions: 

    What's going wrong

    1. Time fields store strings, not numbers. A field formatted as Time holds a value like "08:00 AM". Doing event.value / 60 on a string returns NaN, which is why your final result never comes out right.
    2. The format token "h:mm tt" is wrong. Per Adobe's JavaScript for Acrobat API Reference, lowercase mm means month, not minutes. Minutes must be uppercase: "h:MM tt". Adobe uses this exact token in its own helpx examples (e.g., the dynamic-stamp date/time tutorial).
    3. No subtraction is being done. You need to parse each time into a Date object with util.scand, subtract, then convert milliseconds to decimal hours.

     

    Rename the four field names to match yours.

    (function () {
        var sIn       = this.getField("TimeIn").valueAsString;
        var sLunchOut = this.getField("LunchOut").valueAsString;
        var sLunchIn  = this.getField("LunchIn").valueAsString;
        var sOut      = this.getField("TimeOut").valueAsString;

        // If any field is empty, clear Total and stop
        if (sIn === "" || sLunchOut === "" || sLunchIn === "" || sOut === "") {
            event.value = "";
            return;
        }

        // "h:MM tt" — uppercase MM = minutes (lowercase mm would be month)
        var fmt = "h:MM tt";
        var dIn       = util.scand(fmt, sIn);
        var dLunchOut = util.scand(fmt, sLunchOut);
        var dLunchIn  = util.scand(fmt, sLunchIn);
        var dOut      = util.scand(fmt, sOut);

        // util.scand returns null if parsing fails — handle gracefully
        if (dIn == null || dLunchOut == null || dLunchIn == null || dOut == null) {
            event.value = "";
            return;
        }

        var msMorning   = dLunchOut.getTime() - dIn.getTime();
        var msAfternoon = dOut.getTime()      - dLunchIn.getTime();

        // Guard against negative spans (AM/PM entered incorrectly)
        if (msMorning < 0 || msAfternoon < 0) {
            event.value = "";
            return;
        }

        // ms → decimal hours (1000 × 60 × 60 = 3,600,000)
        var totalHours = (msMorning + msAfternoon) / 3600000;

        event.value = util.printf("%.2f", totalHours); // e.g. "8.50"
    })();

     

    A small note on testing: if you want to inspect what util.scand is returning, open All tools › Use JavaScript › Debugger (JavaScript Console) and run util.scand("h:MM tt", "08:00 AM") you should see a valid Date object.

     

    I hope this helps.

    Regards,

    Anand Sri.

    Alexander-12
    Participant
    May 25, 2026

    Olá Anand,

    Muito obrigado pela explicação detalhada. Eu realmente não tinha percebido que o “mm” minúsculo estava sendo interpretado como mês em vez de minutos, então isso já esclareceu uma grande parte do problema.

    A explicação sobre os campos de horário armazenarem strings em vez de valores numéricos também fez muito mais sentido agora. Vou testar o script usando os nomes reais dos meus campos e verificar o parsing no Console JavaScript como você sugeriu.

    Agradeço bastante pela explicação clara e pelo exemplo do script.

    Anand Sri Bhattacharya
    Community Manager
    Community Manager
    May 25, 2026

    Happy to help ​@Alexander-12 . Please do let us know how it goes.

    Regards,

    Anand Sri.

    jesse_5311
    Participating Frequently
    May 25, 2026

    Esse tipo de formulário parece simples no começo, mas os cálculos de horário no Acrobat acabam ficando mais complicados do que parecem. Principalmente quando precisa somar períodos diferentes e mostrar o resultado final em horas decimais.

    Alexander-12
    Participant
    May 25, 2026

    Obrigado também, Jesse. Seu comentário fez bastante sentido porque eu realmente achei que seria um cálculo simples no começo, mas a parte de converter horários e somar períodos diferentes acabou ficando mais complicada do que eu esperava no Acrobat.