I have a problem when i get a data from DB
I get data like this TIMESTAMP TIME = 2024-05-15 15:12:44.0 – Timestamp SQL (package) type
After i convert to Instant i have offset -3 hours
Like this INSTANT TIME = 2024-05-15T12:12:44Z
Here is my example of code
package ru.goldenage.map.repository.postgres.impl;
import ru.goldenage.map.entity.postgres.CalculatedCar;
import javax.persistence.EntityManager;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.time.Instant;
@Slf4j
@Repository
@AllArgsConstructor
public class CarDAOImpl {
private DataSource dataSource;
private JdbcTemplate postgresTemplate;
private EntityManager em;
public List<CalculatedCar> getCalculatedCarsBy(String minutes) throws SQLException {
String sql = "SELECT tmi.p_id AS id,"
+ "tmi.p_park_id AS parkId, "
+ "tmi.p_gosnumber AS gosnumber,"
+ "tmi.p_park_name AS parkName,"
+ "taotr.p_lon AS lon,"
+ "taotr.p_lat AS lat,"
+ "p_azimuth AS vector,"
+ "p_speed AS speed,"
+ "tmi.p_mark_name AS markName,"
+ "tmi.p_mark_id AS markId,"
+ "tmi.p_transport_type AS TT_Title,"
+ "mt.p_group_id AS groupTransportType,"
+ "mt.p_title AS titleTransportType,"
+ "org.p_title AS organization,"
+ "taotr.p_time AS time,"
+ "p_kilometers AS kilometers,"
+ "coalesce(substring(tum.p_name from 0 for position(' км' in tum.p_name)), '') AS road_name,"
+ "coalesce(tmi.p_navigator, '-') AS stationNum,"
+ "tmi.p_machine_type "
+ "FROM t_machine_info AS tmi "
+ "LEFT JOIN t_machine_type AS mt on tmi.p_machine_type = mt.p_id "
+ "LEFT JOIN t_organization AS org on tmi.p_organization = org.p_id, "
+ "(SELECT * FROM t_auto_on_the_roads "
+ "WHERE p_id in (SELECT max(p_id) FROM t_auto_on_the_roads "
+ "WHERE p_time >= (current_timestamp AT TIME ZONE 'UTC') - (?1 * CAST('1 minutes' AS interval)) "
+ "GROUP BY p_id_auto)) AS taotr "
+ "LEFT JOIN t_unit_members AS tum ON tum.p_id = taotr.p_name_road "
+ "WHERE taotr.p_id_auto = tmi.p_id;";
List<Object[]> resultList = em.createNativeQuery(sql)
.setParameter(1, Integer.parseInt(minutes))
.getResultList();
List<CalculatedCar> calculatedCars = new ArrayList<>(resultList.size());
resultList.forEach(result -> {
BigDecimal id = (BigDecimal)result[0];
Integer parkId = (Integer)result[1];
String gosNumber = (String) result[2];
String parkName = (String) result[3];
Double lon = (Double) result[4];
Double lat = (Double) result[5];
Integer vector = (Integer) result[6];
Integer speed = (Integer) result[7];
String markName = (String) result[8];
Integer markId = (Integer) result[9];
String title = (String) result[10];
BigDecimal groupTransportType = (BigDecimal) result[11];
String titleTransportType = (String) result[12];
String organization = (String) result[13];
Timestamp tmp = (Timestamp) result[14];
System.out.println("TIMESTAMP TIME = " + tmp);
Instant timeUTC = tmp.toInstant();
System.out.println("INSTANT TIME = " + timeUTC);
String kilometers = (String) result[15];
String roadName = (String) result[16];
String stationNum = (String) result[17];
BigDecimal machineType = (BigDecimal) result[18];
CalculatedCar car = CalculatedCar
.builder()
.id(id)
.parkId(parkId)
.gosnumber(gosNumber)
.parkName(parkName)
.lon(lon)
.lat(lat)
.vector(vector)
.speed(speed)
.markName(markName)
.markId(markId)
.TTTitle(title)
.groupTransportType(groupTransportType)
.titleTransportType(titleTransportType)
.organization(organization)
.timeUTC(timeUTC)
.kilometers(kilometers)
.roadName(roadName)
.stationNum(stationNum)
.machineType(machineType)
.build();
calculatedCars.add(car);
});
return calculatedCars;
}
}
the conversion happens in this part of the code
Timestamp tmp = (Timestamp) result[14];
System.out.println("TIMESTAMP TIME = " + tmp);
Instant timeUTC = tmp.toInstant();
System.out.println("INSTANT TIME = " + timeUTC);
I expecting time with UTC date time without changes 2024-05-15 15:12:44.0 because in DB i write a UTC time already, but type in DB Postgres in this table have a Timestamp without time zone.