Data e Hora Java e Mysql

7 respostas
R

Prezados,

Estou com uma grande duvida em uma parte do meu desenvolvimento.
Na minha aplicação, no momento de gravar um registro, é necessário gravar um campo com data, e outro campo com hora.
No momento da gravação, eu passo duas variáveis, assim:

Calendar c = Calendar.getInstance();
        java.util.Date horaHoje = c.getTime();
        java.util.Date dataHoje = c.getTime();

No momento que criei a tabela no Mysql, coloquei assim:

datahoje date DEFAULT NULL,
horahoje time DEFAULT NULL,

Está registrando certinho, tanto a data como a hora.

Gostaria de saber se está correto o modo que eu realizei o procedimento.
Ou se talvez fosse necessário apenas um campo date, com data e hora juntos.

Eu preciso de um campo hora separado da data, para a seguinte finalidade:
Preciso saber a diferença de horas, entre um registro e outro. Esta aplicação é um controle de OS, onde eu preciso saber, quanto tempo a OS demorou para ser atendida. Assim, vou precisar calcular a hora do registro da OS, e a hora que foi atendida.

Peço orientações sobre como proceder da forma correta.
Grato!

7 Respostas

ezequiellorenzatti

Acredito que você deve utilizar um campo com formato datetime, que também resolve o caso do tempo de atendimento, visto que se ocorre de um atendimento demorar mais que 24 horas você terá problemas no formato atual.

R

ezequiellorenzatti:
Acredito que você deve utilizar um campo com formato datetime, que também resolve o caso do tempo de atendimento, visto que se ocorre de um atendimento demorar mais que 24 horas você terá problemas no formato atual.

Obrigado pela dica.
Alguem teria um exemplo, para que eu saiba quantas horas ou dias demorou para um determinado registro ?

Exemplo:
Data chamado: 2014-03-04 10:19:50
Data atendimento: 2014-03-05 08:20:19

Preciso saber quantas horas demorou para ser atendido.
Grato!

pmlm

É isto que precisas?

ezequiellorenzatti

Segue um exemplo bem básico de calcular o tempo entre uma data e outra, claro que existem formas melhores e mais precisas de se fazer.

import java.util.Calendar;

public class CalculoTempo {

	public static void main(String[] args) {

		// esse valor deverá ser obtido do banco de dados eu fiz assim só pra
		// ter um exemplo, simulando que a entrada foi feita em 01/03/2013
		Calendar entrada = Calendar.getInstance();
		entrada.set(Calendar.YEAR, 2014);
		entrada.set(Calendar.MONTH, Calendar.MARCH);
		entrada.set(Calendar.DAY_OF_MONTH, 1);
		entrada.set(Calendar.HOUR_OF_DAY, 0);
		entrada.set(Calendar.MINUTE, 0);
		entrada.set(Calendar.SECOND, 0);

		// esse valor deverá ser obtido do banco de dados eu fiz assim só pra
		// ter um exemplo, simulando que o atendimento foi feito em 03/03/3014
		Calendar atendimento = Calendar.getInstance();
		atendimento.set(Calendar.YEAR, 2014);
		atendimento.set(Calendar.MONTH, Calendar.MARCH);
		atendimento.set(Calendar.DAY_OF_MONTH, 03);
		atendimento.set(Calendar.HOUR_OF_DAY, 0);
		atendimento.set(Calendar.MINUTE, 0);
		atendimento.set(Calendar.SECOND, 0);

		long milliseconds = atendimento.getTimeInMillis()
				- entrada.getTimeInMillis();
		long seconds = milliseconds / 1000;
		long minutes = seconds / 60;
		long hours = minutes / 60;
		long days = hours / 24;

		System.out.println("Miliseconds " + milliseconds);
		System.out.println("Seconds " + seconds);
		System.out.println("Minutes " + minutes);
		System.out.println("Hours " + hours);
		System.out.println("Days " + days);

	}
}
A

ricardodru:
ezequiellorenzatti:
Acredito que você deve utilizar um campo com formato datetime, que também resolve o caso do tempo de atendimento, visto que se ocorre de um atendimento demorar mais que 24 horas você terá problemas no formato atual.

Obrigado pela dica.
Alguem teria um exemplo, para que eu saiba quantas horas ou dias demorou para um determinado registro ?

Exemplo:
Data chamado: 2014-03-04 10:19:50
Data atendimento: 2014-03-05 08:20:19

Preciso saber quantas horas demorou para ser atendido.
Grato!

Fiz esse exemplo, espero que ajude… Caso vc use a Data vindo do seu banco de dados
não precisaria usar nem Calendar consequentemente nem o método registro

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

public class CalculoTempo {    
    
    //86400000 milisegundos é igual há 1 dia, 0 hora e 0 segundo.
    private static final long UM_DIA = 86400000;   
    private static Calendar calendar = Calendar.getInstance(Locale.ROOT);
      
    public static void main(String[] args) {
        //Chamado 2014-03-04 10:19:50       
        long chamado = registro(2014, 3, 4, 10, 19, 50);
        //Atendimento 2014-03-05 08:20:19
        long atendimento = registro(2014, 3, 5, 8, 20, 19);        
        System.out.println(atrasoAtendimento(atendimento, chamado));   
    }
    
    private static long registro(int ano, int mes, int dia, int hora, int min, int sec) {        
        calendar.set(ano, mes, dia, hora, min, sec);       
        return calendar.getTime().getTime();
    } 
    
    private static String horas(long tempo) {
        DateFormat df = new SimpleDateFormat("HH:mm:ss");
        df.setTimeZone(TimeZone.getTimeZone("GMT"));
        return df.format(new Date(tempo));
    }
    
    private static String atrasoAtendimento(long atendimento, long chamado) {
        long tempo = atendimento - chamado;         
        return (tempo == 0) ? "Sem Atrasos !!" : (tempo < UM_DIA) ? "Atraso de Horas: " + horas(tempo) : 
               (tempo > UM_DIA) && ((tempo % UM_DIA) == 0) ? "Atraso de Dias: " + (int)(tempo / UM_DIA) :
               (tempo > UM_DIA) && ((tempo % UM_DIA) > 0) ? "Atraso de Dias: " + (int)(tempo / UM_DIA) +
                " e " + horas(tempo) : "Atrasou 1 dia";
    }
}
igor_ks

Recomendo utilizar o JodaTime também como o pmlm disse. Além de ser mais fácil, no java 8 será a implementação padrão de datas baseado nessa lib

A

Realmente o Joda-Time facilita e muito as coisas… Fiz um novo exemplo com ele…
Download do Joda-Time --> http://sourceforge.net/projects/joda-time/files/joda-time/

import org.joda.time.DateTime;
import org.joda.time.DurationFieldType;
import org.joda.time.Interval;
import org.joda.time.PeriodType;
import org.joda.time.format.PeriodFormatter;
import org.joda.time.format.PeriodFormatterBuilder;

public class CalculoTempo {
    
    public static void main(String[] args) {
        //Chamado 2014-03-04 10:19:50
        long chamado = registro(2014, 3, 4, 10, 19, 50); 
        //Atendimento 2014-03-05 08:20:19 
        long atendimento = registro(2014, 3, 5, 8, 20, 19);        
        System.out.println(format(chamado, atendimento));       
    }
    
    private static String format(long chamado, long atendimento) {      
        return formatPeriodo().print((new Interval(chamado, atendimento)).toPeriod(typePeriodo()));
    }
    
    private static long registro(int ano, int mes, int dia, int hora, int min, int sec) {       
        return new DateTime(ano, mes, dia, hora, min, sec).getMillis();  
    }
    
    private static PeriodType typePeriodo() {
        return PeriodType.forFields(new DurationFieldType[] {
            DurationFieldType.years(),
            DurationFieldType.months(),
            DurationFieldType.days(),
            DurationFieldType.hours(),
            DurationFieldType.minutes(),
            DurationFieldType.seconds()
        });
    }
    
    private static PeriodFormatter formatPeriodo() {
        return new PeriodFormatterBuilder()
                .printZeroAlways()
                .appendLiteral("Atraso Anos: ")
                .appendYears()
                .appendLiteral("\nAtraso Meses: ")
                .appendMonths()
                .appendLiteral("\nAtraso Dias: ")
                .appendDays()
                .appendLiteral("\nAtraso Horas: ")
                .minimumPrintedDigits(2)
                .appendHours().minimumPrintedDigits(2)
                .appendPrefix(":").appendMinutes().minimumPrintedDigits(2)
                .appendPrefix(":").appendSeconds().minimumPrintedDigits(2)
                .toFormatter();
    }   
}
Criado 3 de março de 2014
Ultima resposta 7 de mar. de 2014
Respostas 7
Participantes 5