我有一个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。
我真的不明白发生了什么事。
有什么想法吗?
答案 0 :(得分:1)
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
。因此,我认为您在那之后的某个时间点就掌握了一切。
其他要点:
Date
和SimpleDateFormat
设计得很差,而且已经过时了,所以我建议您避免使用它们。现代的java.time更好用。Oracle tutorial: Date Time解释了如何使用java.time。