在Java中获得没有时区的时间

时间:2016-08-23 16:08:14

标签: java postgresql date

我在postgreSQL中有一个函数,它有一个没有时区列的时间。然后在我的方法中,我在设置参数时出错。它说类型不明。如何使用当前系统时间设置此参数?该方法的目的是验证DB中是否存在寄存器。

功能:

 CREATE OR REPLACE FUNCTION public.inserir_posicao(
    _tag bigint,
    _data_hora timestamp without time zone,
    _lat double precision,
    _long double precision,
    _gado_id bigint)
  RETURNS integer AS
$BODY$declare
  tagPesq BigInt;
begin

  select tag into tagPesq from coordenadas where tag = $1;
  if tagPesq is not null and tagPesq > 0 then
     update coordenadas set pos_data = $2, 
    pos_latitude = $3,
    pos_longitude = $4,
    gado_id = $5
    where tag_id = $1;
  else
     insert into coordenadas(pos_data,pos_latitude,pos_longitude,
    tag_id, gado_id) values ($2,$3,$4,$1,$5);
  end if;

  return 1;

  EXCEPTION WHEN RAISE_EXCEPTION THEN
  BEGIN
    return 0;
  END;
end;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION public.inserir_posicao(bigint, time with time zone, double precision, double precision, bigint)
  OWNER TO postgres;

方法:

public int insertPosicao(BigInteger tagId, BigInteger gadoId, double lat, double lon) {

        Query qry = manager.createNativeQuery("select inserir_posicao(:tag,:data,:lat,:lng,:gado)");
        qry.setParameter("tag", tagId);
        qry.setParameter("data", ??? ); //this parameter.
        qry.setParameter("lat", lat);
        qry.setParameter("lng", lon);
        qry.setParameter("gado", gadoId);
        return (int) qry.getSingleResult();
    }

2 个答案:

答案 0 :(得分:1)

你可以用

之类的东西
SimpleDateFormat sdf = new SimpleDateFormat(**pattern**);
String sData = sdf.format(GregorianCalendar.getInstance());
qry.setParameter("date",sData);

您必须指定模式

在我的代码中,我将GregorianCalendar.getInstance返回当前时间。您还可以通过查询sysdate来实现此目的。 在你的功能上,

pos_data = $2你必须设置pos_data=to_date($2,**pattern**),因为现在,你传递一个String代表日期,并通过postgres函数将它转换为日期

另请参阅:SimpleDateFormatto_date PostgreSQL

答案 1 :(得分:1)

您只能在Java 8中使用以下内容来获取UTC的本地时间偏移且没有区域:

String ldt = Instant.now().atOffset(ZoneOffset.UTC).toLocalDateTime().toString();
qry.setParameter("data",ldt);

如果您有自己的日期,则可以使用相同的代码,只需将Instant.now()替换为Instant.parse(date),但必须正确格式化。