Dev*_*Dev 6 java instant java-8 localdatetime
我想将 Instant / LocalDateTime 舍入到 Java 中最接近的 5 分钟间隔。
示例:假设时间是:
2021-02-08T19:01:49.594
Run Code Online (Sandbox Code Playgroud)
或者
2021-02-08T19:02:49.594
Run Code Online (Sandbox Code Playgroud)
或者
2021-02-08T19:03:49.594
Run Code Online (Sandbox Code Playgroud)
或者
2021-02-08T19:04:49.594
Run Code Online (Sandbox Code Playgroud)
预期结果:
2021-02-08T19:00:00.000
Run Code Online (Sandbox Code Playgroud)
And*_*eas 14
对于更通用、可重用的解决方案,请实现TemporalUnit与该方法一起使用的自定义truncatedTo\xe2\x80\x8b(TemporalUnit unit)。下面是从另一个答案复制的实现。
然后,您只需使用它truncatedTo()以 5 分钟“单位”进行呼叫即可。它适用于LocalDateTime和Instant。
String[] inputs = { "2021-02-08T19:01:49.594", "2021-02-08T19:02:49.594",\n "2021-02-08T19:03:49.594", "2021-02-08T19:04:49.594",\n "2021-02-08T19:26:49.594", "2021-02-08T19:27:49.594",\n "2021-02-08T19:28:49.594", "2021-02-08T19:29:49.594" };\nfor (String input : inputs) {\n LocalDateTime dateTime = LocalDateTime.parse(input);\n Instant instant = Instant.parse(input + "Z");\n System.out.printf("%s -> %s %s -> %s%n",\n dateTime, dateTime.truncatedTo(DurationUnit.ofMinutes(5)),\n instant, instant.truncatedTo(DurationUnit.ofMinutes(5)));\n}\nRun Code Online (Sandbox Code Playgroud)\n输出
\n2021-02-08T19:01:49.594 -> 2021-02-08T19:00 2021-02-08T19:01:49.594Z -> 2021-02-08T19:00:00Z\n2021-02-08T19:02:49.594 -> 2021-02-08T19:00 2021-02-08T19:02:49.594Z -> 2021-02-08T19:00:00Z\n2021-02-08T19:03:49.594 -> 2021-02-08T19:00 2021-02-08T19:03:49.594Z -> 2021-02-08T19:00:00Z\n2021-02-08T19:04:49.594 -> 2021-02-08T19:00 2021-02-08T19:04:49.594Z -> 2021-02-08T19:00:00Z\n2021-02-08T19:26:49.594 -> 2021-02-08T19:25 2021-02-08T19:26:49.594Z -> 2021-02-08T19:25:00Z\n2021-02-08T19:27:49.594 -> 2021-02-08T19:25 2021-02-08T19:27:49.594Z -> 2021-02-08T19:25:00Z\n2021-02-08T19:28:49.594 -> 2021-02-08T19:25 2021-02-08T19:28:49.594Z -> 2021-02-08T19:25:00Z\n2021-02-08T19:29:49.594 -> 2021-02-08T19:25 2021-02-08T19:29:49.594Z -> 2021-02-08T19:25:00Z\nRun Code Online (Sandbox Code Playgroud)\nInstant作为通用目的,它实际上可以与、LocalDateTime、OffsetDateTime、ZonedDateTime、LocalTime和一起使用OffsetTime,并且可以与分为一整天的任何时间段一起使用(例如 180 秒、或 5 分钟、或 2 小时,但不能是 7 分钟) 。
System.out.println(Instant.now().truncatedTo(DurationUnit.ofHours(2)));\nSystem.out.println(LocalDateTime.now().truncatedTo(DurationUnit.ofHours(2)));\nSystem.out.println(OffsetDateTime.now().truncatedTo(DurationUnit.ofHours(2)));\nSystem.out.println(ZonedDateTime.now().truncatedTo(DurationUnit.ofHours(2)));\nSystem.out.println(LocalTime.now().truncatedTo(DurationUnit.ofHours(2)));\nSystem.out.println(OffsetTime.now().truncatedTo(DurationUnit.ofHours(2)));\nRun Code Online (Sandbox Code Playgroud)\n输出
\n2021-02-15T06:00:00Z\n2021-02-15T02:00\n2021-02-15T02:00-05:00\n2021-02-15T02:00-05:00[America/New_York]\n02:00\n02:00-05:00\nRun Code Online (Sandbox Code Playgroud)\n自定义时间单位
\npublic final class DurationUnit implements TemporalUnit {\n\n private static final int SECONDS_PER_DAY = 86400;\n private static final long NANOS_PER_SECOND = 1000_000_000L;\n private static final long NANOS_PER_DAY = NANOS_PER_SECOND * SECONDS_PER_DAY;\n\n private final Duration duration;\n\n public static DurationUnit of(Duration duration) { return new DurationUnit(duration); }\n public static DurationUnit ofDays(long days) { return new DurationUnit(Duration.ofDays(days)); }\n public static DurationUnit ofHours(long hours) { return new DurationUnit(Duration.ofHours(hours)); }\n public static DurationUnit ofMinutes(long minutes) { return new DurationUnit(Duration.ofMinutes(minutes)); }\n public static DurationUnit ofSeconds(long seconds) { return new DurationUnit(Duration.ofSeconds(seconds)); }\n public static DurationUnit ofMillis(long millis) { return new DurationUnit(Duration.ofMillis(millis)); }\n public static DurationUnit ofNanos(long nanos) { return new DurationUnit(Duration.ofNanos(nanos)); }\n\n private DurationUnit(Duration duration) {\n if (duration.isZero() || duration.isNegative())\n throw new IllegalArgumentException("Duration may not be zero or negative");\n this.duration = duration;\n }\n\n @Override\n public Duration getDuration() {\n return this.duration;\n }\n\n @Override\n public boolean isDurationEstimated() {\n return (this.duration.getSeconds() >= SECONDS_PER_DAY);\n }\n\n @Override\n public boolean isDateBased() {\n return (this.duration.getNano() == 0 && this.duration.getSeconds() % SECONDS_PER_DAY == 0);\n }\n\n @Override\n public boolean isTimeBased() {\n return (this.duration.getSeconds() < SECONDS_PER_DAY && NANOS_PER_DAY % this.duration.toNanos() == 0);\n }\n\n @Override\n @SuppressWarnings("unchecked")\n public <R extends Temporal> R addTo(R temporal, long amount) {\n return (R) this.duration.multipliedBy(amount).addTo(temporal);\n }\n\n @Override\n public long between(Temporal temporal1Inclusive, Temporal temporal2Exclusive) {\n return Duration.between(temporal1Inclusive, temporal2Exclusive).dividedBy(this.duration);\n }\n\n @Override\n public String toString() {\n return this.duration.toString();\n }\n\n}\nRun Code Online (Sandbox Code Playgroud)\n
您可以将其截断为ChronoUnit.MINUTES,然后根据要求检查分钟,即如果它不是5除以 时减去余数的倍数5。用于返回更改了分钟的LocalDate#withMinute副本。LocalDateTime
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
class Main {
public static void main(String[] args) {
// Test
String[] arr = { "2021-02-08T19:02:49.594", "2021-02-08T19:56:49.594", "2021-02-08T19:54:49.594",
"2021-02-08T19:06:49.594" };
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSS");
for (String s : arr) {
System.out.println(roundToNearestHour(s).format(dtf));
}
}
static LocalDateTime roundToNearestHour(String str) {
LocalDateTime ldt = LocalDateTime.parse(str).truncatedTo(ChronoUnit.MINUTES);
int minute = ldt.getMinute();
int remainder = minute % 5;
if (remainder != 0) {
ldt = ldt.withMinute(minute - remainder);
}
return ldt;
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
2021-02-08T19:00:00.000
2021-02-08T19:55:00.000
2021-02-08T19:50:00.000
2021-02-08T19:05:00.000
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4197 次 |
| 最近记录: |