GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Converter método que usa java.util.Date [RESOLVIDO]


#1

Pessoal bom dia, tudo bem ?
Estou trabalhando em um sistema que acabamos de atualizar para o Java 8 e estou mexendo em pontos onde temos a classe date pra usar as classes LocalDate/LocaldateTime mas achei um código que estou com muita dificuldades de ajustar, essa classe tem um método que recebe 2 strings que são data e hora usando timezone da maquina onde está rodando e converte a data para a timezone de Greenwich, mas quando tentava setar a timezone ao invês de reduzir 2 horas da data (rodei o código em uma maquina na nossa timezone no horário de verão) ele está aumentando 2 horas, ex:
correto:
data horario de verão Brasil 12:00
data Greenwich 10:00

resultado que recebi:

data horario de verão Brasil 12:00
data Greenwich 14:00

Segue o código que funciona usando a classe Date e que gostaria de trocar para as classes do java 8:

@Log4j2
public class ConvertStringDate {
	
	private TimeZone timeZoneServidor;
	private TimeZone timeZoneGreenwich;
	
	private SimpleDateFormat sdfServidor;
	private SimpleDateFormat sdfGreenwich;
	
	private Calendar calendario;
	
	public ConvertStringDate() {
		super();
		
		this.timeZoneServidor = TimeZone.getDefault();
		this.timeZoneGreenwich = TimeZone.getTimeZone("Greenwich");
		
		this.calendario = Calendar.getInstance();
		this.calendario.setTimeZone(timeZoneServidor);
		
		this.sdfServidor = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		this.sdfGreenwich = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		
		sdfServidor.setTimeZone(timeZoneServidor);
		sdfGreenwich.setTimeZone(timeZoneGreenwich);
	}
	
	public Date converteStringDataTimeZoneServer(String horaOriginal, String dataATratar) {
		String dataHoraFormata = this.obterDataFormatadaGPS(horaOriginal, dataATratar);
		
		Date dataServidor =  null;
		try {
			Date dataGPS = this.sdfGreenwich.parse(dataHoraFormata);
			
			this.calendario.setTime(dataGPS);
			dataServidor = calendario.getTime();
			log.info(String.format("> Data Hora GPS -> %s | %s <- Data Hora Servidor.", dataHoraFormata, sdfServidor.format(dataServidor)));
		}
		catch(ParseException e) {
			log.error(String.format("Erro ao realizar o parse da data/hora [GPS | Servidor] (%s / %s): %s.", dataHoraFormata, dataServidor, e.toString()));
		}
		
		return dataServidor;
	}
	
	private String obterDataFormatadaGPS(String horaOriginal, String dataATratar) {
		String dataHoraFormata = null;
		
		//obter horario
		String hora = horaOriginal.substring(0,2);
		String min = horaOriginal.substring(2,4);
		String seg = horaOriginal.substring(4,6);
		
		//obter data
		// tratamento para nao perder a compatibilidade com o rastreador anterior
		if(dataATratar.indexOf(",") > 0) {
			dataATratar = dataATratar.substring(dataATratar.indexOf(",") + 1, dataATratar.length());
			dataATratar = dataATratar.substring(dataATratar.indexOf(",") + 1, dataATratar.length());
		}
		
		String dia = "";
		String mes = "";
		String ano = "";
		//AAAAMMDD
		if(dataATratar.length() == 8) {
			dia = dataATratar.substring(6,8);
			mes = dataATratar.substring(4,6);
			ano = "20" + dataATratar.substring(2,4);		
		}
		//DDMMAA
		else {
			dia = dataATratar.substring(0,2);
			mes = dataATratar.substring(2,4);
			ano = "20" + dataATratar.substring(4,6);
		}
		
		//formado da data - dd/MM/yyyy HH:mm:ss
		dataHoraFormata = dia + "/" + mes + "/" + ano + " " + hora + ":" + min + ":" + seg;
		
		return dataHoraFormata;
	}	
}

#2

Verifique o horário do servidor se não esta errado.
Se não tiver errado tente setar o horário do servidor como o horário pt-bt ou “GMT-3”


#3

Amigo, o horário do servidor está certo, esse código que postei também funciona, o que estou tentando fazer é escrever essa mesma função usando as classes de data do java 8.


#4

Boa tarde amigo.

Não entendi o pq de parte do seu código, mas está ai:

@Log4j2
public class ConvertStringDate {

private final Logger log = Logger.getLogger(this.getClass().getName());
private final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss");
private final long offset = ZonedDateTime.now().getOffset().getLong(ChronoField.OFFSET_SECONDS);

public void test() {
    ConvertStringDate csd = new ConvertStringDate();
    csd.converteStringDataTimeZoneServer("141600", "100119");
}

public ConvertStringDate() {
    super();
}

public LocalDateTime converteStringDataTimeZoneServer(String horaOriginal, String dataATratar) {
    LocalDateTime ldt = this.obterDataFormatadaGPS(horaOriginal, dataATratar);
    String dataHoraFormatada = "";
    String dataServidor = "";
    try {
        dataHoraFormatada = ldt.format(dtf);
        dataServidor = ldt.plusSeconds(offset).format(dtf);
        log.info(String.format("> Data Hora GPS -> %s | %s <- Data Hora Servidor.", dataHoraFormatada, dataServidor));
    } catch (Exception e) {
        log.error(String.format("Erro ao realizar o parse da data/hora [GPS | Servidor] (%s / %s): %s.", dataHoraFormata, dataServidor, e.toString()));
    }
    return ldt;
}

private LocalDateTime obterDataFormatadaGPS(String horaOriginal, String dataATratar) {
    //obter horario
    LocalTime time = LocalTime.parse(horaOriginal, DateTimeFormatter.ofPattern("HHmmss"));
    //obter data
    // tratamento para nao perder a compatibilidade com o rastreador anterior
    if (dataATratar.indexOf(",") > 0) {
        dataATratar = dataATratar.substring(dataATratar.indexOf(",") + 1, dataATratar.length());
        dataATratar = dataATratar.substring(dataATratar.indexOf(",") + 1, dataATratar.length());
    }

    LocalDate date = dataATratar.length() == 8
            ? LocalDate.parse(dataATratar, DateTimeFormatter.ofPattern("yyyyMMdd"))
            : LocalDate.parse(dataATratar, DateTimeFormatter.ofPattern("ddMMyy"));

    //formado da data - dd/MM/yyyy HH:mm:ss
    return LocalDateTime.of(date, time);
}
}

Espero que consiga entender. :metal::sunglasses::metal:


#5

Obrigado Villagram, sua solução resolveu meu problema, qual parte do código você não entendeu?


#6

Essa, não sei o que faz então não mexi.


#7

a sim, é que na verdade esse método está em um sistema em meu trabalho que trata dados hexadecimais que vem de um rastreador, e como temos vários rastreadores integrados no sistema, temos rastreadores que mandam os dígitos de data e hora todos juntos, tem quem manda como por exemplo nesse caso separados por virgula, é só uma tratativa dos dados mesmo, mais uma vez obrigado :slight_smile: