public static Instant roundEvenHourUp(final Instant instant) {
final Instant rounedInstant = instant
.plus(ChronoUnit.HOURS.getDuration().minus(1, ChronoUnit.MICROS))
.truncatedTo(ChronoUnit.HOURS);
final int hour = rounedInstant.atZone(ZoneId.systemDefault()).getHour();
return rounedInstant.plus(hour % 2, ChronoUnit.HOURS);
}
final LocalDateTime date = LocalDateTime.now();
final Instant instant = roundEvenHourUp(date.atZone(ZoneId.systemDefault()).toInstant());
System.out.format("%1$td.%1$tm.%1$tY %1$tH:%1$tM:%1$tS",
instant.atZone(ZoneId.systemDefault()));
for (int i = 0; i < 23; i++) {
final LocalDateTime date = LocalDateTime.of(2023, Month.MAY, 2, i, 57, 57);
final Instant instant = roundEvenHourUp(date.atZone(ZoneId.systemDefault()).toInstant());
System.out.format("%1$td.%1$tm.%1$tY %1$tH:%1$tM:%1$tS%n",
instant.atZone(ZoneId.systemDefault()));
}
Noch ein modulo 24 nachschalten (damit bspw. 23 Uhr auf 0 Uhr geändert wird) und es sollte passenSpontan haette ich gesagt Stunde +2 und Minuten und Sekunden einfach auf 0 setzen. Muesste ich aber nochmal darueber nachdenken ob das alle Eckfaelle abdeckt, aber denke schon.
Danke... so ähnlich hats funktioniert:Spontan haette ich gesagt Stunde +2 und Minuten und Sekunden einfach auf 0 setzen. Muesste ich aber nochmal darueber nachdenken ob das alle Eckfaelle abdeckt, aber denke schon.
public static void normalizeJsonData() throws IOException {
long one_hour = (1000 * 60 * 60);
long two_hours = (1000 * 60 * 60 * 2);
File dir = new File(DIR_NAME);
File[] files = dir.listFiles();
if (files == null) throw new AssertionError();
for (File file : files) {
JsonArray array = getJsonArray(file);
JsonObject firstObj = array.get(0).getAsJsonObject();
long start = firstObj.get("x").getAsLong() / two_hours * two_hours;
long stop = start + two_hours;
List<List<JsonObject>> chunks = new ArrayList<>();
List<JsonObject> newChunks = new ArrayList<>();
for (JsonElement je : array) {
JsonObject jo = je.getAsJsonObject();
long x = jo.get("x").getAsLong();
if (x >= start && x < stop) {
newChunks.add(jo);
} else {
chunks.add(newChunks);
newChunks = new ArrayList<>();
newChunks.add(jo);
start = stop;
stop = stop + two_hours;
}
}
chunks.add(newChunks);
JsonArray newArray = new JsonArray();
for (List<JsonObject> chunk : chunks) {
double min =
chunk.stream()
.mapToDouble(jo -> jo.get("y").getAsFloat())
.min()
.orElseThrow();
double max =
chunk.stream()
.mapToDouble(jo -> jo.get("y").getAsFloat())
.max()
.orElseThrow();
double avr =
chunk.stream()
.mapToDouble(jo -> jo.get("y").getAsFloat())
.average()
.orElseThrow();
double newY = Math.abs(min - avr) >= Math.abs(max - avr) ? min : max;
long newX =
chunk.get(0).getAsJsonObject().get("x").getAsLong() / two_hours * two_hours
+ one_hour;
JsonObject newObj = new JsonObject();
newObj.addProperty("x", newX);
newObj.addProperty("y", (float) newY);
newArray.add(newObj);
}
try (FileWriter fw = new FileWriter(file, Charset.defaultCharset())) {
fw.write(newArray.toString());
}
}
}
long start = longZeitstempel / two_hours * two_hours;
long stop = start + two_hours;