InfluxDB'请求选择时间>时间戳记

时间:2019-02-20 16:37:54

标签: java timestamp influxdb influxql

我有一个Java应用程序,可以将测量结果发送到influxDB数据库。

我正在我的influxdb数据库中添加点。 我每次程序运行时添加的点具有当前时间戳。

这就是我添加积分(测量建筑物)的方式:

.gitignore

我的探究是,当我用这样的请求来请求数据库时:

    BatchPoints batchPoints;

    Date date = new Date();

    String beginofday = Constant.simpledateFormat.format(date);

    date = Constant.simpledateFormat.parse(beginofday);

    long timestamp = date.getTime();

    //adding points
    for buildings ... do
    Point point = Point.measurement("building").tag(tagsToAdd).fields(fieldsToAdd)
                        .time(timestamp, TimeUnit.NANOSECONDS).build();

    batchPoints.point(point);

我注意到,即使我正在执行time> timestamp,也要计算以前的时间戳结果。 当我执行>而不是> =时,它仅计算最后一个。 我还注意到,对于前一个时间戳,例如,如果我有这样的时间戳1540300800000 ns,则influxdb在开始时添加一个6,它将变为61540300800000 ms。

我真的不明白发生了什么事。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

java.time

    ZoneId zone = ZoneId.systemDefault();
    Instant beginofday = LocalDate.now(zone).atStartOfDay(zone).toInstant();

    long timestamp = beginofday.toEpochMilli();

    //adding points
    for buildings ... do
    Point point = Point.measurement("building").tag(tagsToAdd).fields(fieldsToAdd)
                        .time(timestamp, TimeUnit.MILLISECONDS).build();

我正在使用现代Java日期和时间API java.time。

您的代码出了什么问题

虽然我尚未进行复制和测试,但我相信您混淆了毫秒 10 ^ -3秒和纳秒 10 ^ -9秒。 date.getTime()为您提供了从纪元以来的毫秒数,但是您正在将数字传递给time(timestamp, TimeUnit.NANOSECONDS)。如果我将今天的开始时间(2月21日)设为我的时区(CET),并将历元以来的毫秒数设为纳秒,则会得到1970-01-01T00:25:50.703600Z。因此,我认为您在那之后的某个时间点就掌握了一切。

其他要点:

  • 您使用的类DateSimpleDateFormat设计得很差,而且已经过时了,所以我建议您避免使用它们。现代的java.time更好用。
  • 将日期时间格式化为日期字符串并进行解析,这是寻找一天开始时间的绕道之路。

链接

Oracle tutorial: Date Time解释了如何使用java.time。