0

我有一个将测量值发送到 influxDB 数据库的 java 应用程序。

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

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

    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);

我的问题是,当我用这样的请求请求我的数据库时:

select count(tag) from building where time > (my timestamp)

我注意到以前的时间戳结果也被计算在内,即使我正在做时间>时间戳。当我做 > 而不是 >= 它只计算最后一个。我还注意到,对于上一个时间戳,例如,如果我有像这样的时间戳 1540300800000 ns,influxdb 在开头添加一个 6,它变成 61540300800000 ms。

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

有任何想法吗?

4

1 回答 1

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.time,这是现代 Java 日期和时间 API。

你的代码出了什么问题

虽然我没有复制和测试,但我相信你混淆了毫秒,10^-3 秒和纳秒,10^-9 秒。date.getTime()自纪元以来为您提供毫秒数,但您将数字传递给time(timestamp, TimeUnit.NANOSECONDS). 如果我今天(2 月 21 日)在我的时区(CET)开始一天,并使用自纪元以来的毫秒数作为纳秒,我得到1970-01-01T00:25:50.703600Z. 所以我假设你在那段时间之后得到了一切。

其他要点:

  • 您使用的课​​程DateSimpleDateFormat您使用的课​​程设计不佳且早已过时,因此我建议您避免使用它们。现代的 java.time 使用起来要好得多。
  • 将您的日期时间格式化为日期字符串并将其解析回来是查找一天开始的弯路。

关联

Oracle 教程:日期时间解释如何使用 java.time。

于 2019-02-21T08:21:07.627 回答