como você pode combinar data e hora sql em uma única data e hora em java? [duplicado]

Sep 06 2020

Usando o Java Calendar, como você pode combinar a data de início, dia e hora de início?

Por exemplo:

Se a data de início for 08/09/2020. O dia é 2 e a hora de início é 8h00, então como podemos obter uma data java que seja 09/09/2020 8h00. Aqui está minha tentativa malsucedida.

def startDateTime(Date startDate, int day, java.sql.Time startTime){    

        def date
        date = Calendar.getInstance()
        date.setTime(startDate)

        //adding day. since day 1 is the first day we need to add day - 1
        date.add(Calendar.DATE, day - 1)   
        // setting the time from startTime
        date.setTimeInMillis(startTime.getTime())
    
        return date.getTime()

    }

Obrigado pela ajuda.

Respostas

1 Smile Sep 06 2020 at 13:08

Você está ligando date.setTime(startDate)e date.setTimeInMillis(startTime.getTime()). O segundo método substitui o tempo definido no primeiro método. Você deve criar 2 instâncias separadas do Calendário.

Aqui está como você pode conseguir isso

  1. Crie Calendarinstâncias separadas para startDayestartTime
  2. Construir um novo Calendarobjeto a partir de Calendarobjetos separados criados em # 1 e adicionar dayconforme o requisito

Aqui está o código completo:

import java.sql.Time;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.Date;

public class ProofOfConcept {

    public static void main(String[] args) {
        int day = 2;

        Time startTime = new Time(1, 1, 1);
        Calendar timeCalendar = Calendar.getInstance();
        timeCalendar.setTime(startTime);

        Date startDate = new Date();
        Calendar startDateCalendar = Calendar.getInstance();
        startDateCalendar.setTime(startDate);

        /* Only java 8 and above
        LocalDateTime localDateTime = LocalDateTime.of(startDateCalendar.get(Calendar.YEAR), startDateCalendar.get(Calendar.MONTH) + 1, startDateCalendar.get(Calendar.DAY_OF_MONTH),
                timeCalendar.get(Calendar.HOUR), timeCalendar.get(Calendar.MINUTE), timeCalendar.get(Calendar.SECOND));
        localDateTime = localDateTime.plusDays(day);
        System.out.println("localDateTime : " + localDateTime);
        Date dateFromLocalDateTime = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
        System.out.println("dateFromLocalDateTime : " + dateFromLocalDateTime);*/

        Calendar result = Calendar.getInstance();
        result.set(startDateCalendar.get(Calendar.YEAR), startDateCalendar.get(Calendar.MONTH), startDateCalendar.get(Calendar.DAY_OF_MONTH) + 2,
                timeCalendar.get(Calendar.HOUR), timeCalendar.get(Calendar.MINUTE), timeCalendar.get(Calendar.SECOND));

        Date date = result.getTime();
        System.out.println("date : " + date);
    }

}

Resultado:

data: terça-feira, 08 de setembro, 01:01:01 IST 2020

Nota: Eu sugiro usar java.time.*pacotes java.util.*. Por quê? Verifique isso . Mas isso está disponível apenas em java 8. (embora você possa usar o tempo joda nas versões abaixo de 8).


Edit: Movendo o comentário de Ole VV para responder.

Para o Java 7, sugiro usar java.timea moderna API Java de data e hora, por meio do backport, ThreeTen Backport .

static LocalDateTime startDateTime(Date startDate, int day, java.sql.Time startTime) {
    LocalTime startLocalTime = DateTimeUtils.toLocalTime(startTime);
    return DateTimeUtils.toInstant(startDate)
            .atZone(ZoneId.systemDefault())
            .toLocalDate()
            .plusDays(day - 1)
            .atTime(startLocalTime);
}