private static final int MIN_SEQ = 0;
private static final int MAX_SEQ = 9;
private static final DateTimeFormatter FORMATTER
= DateTimeFormatter.ofPattern("yyMMddHHmmss");
private LocalDateTime lastTime = LocalDateTime.now(ZoneId.systemDefault())
.minusMinutes(1); // Initialize to a time in the past
private int lastSeq = 0; // Initialize to any value
public String getUniqueId() {
LocalDateTime time = LocalDateTime.now(ZoneId.systemDefault())
.truncatedTo(ChronoUnit.SECONDS);
if (time.isBefore(lastTime)) {
throw new IllegalStateException("Time is going backward");
}
if (time.isAfter(lastTime)) {
lastTime = time;
lastSeq = MIN_SEQ;
} else { // Still the same time
lastSeq++;
}
if (lastSeq > MAX_SEQ) {
throw new IllegalStateException("Out of sequence numbers for this time");
}
return lastTime.format(FORMATTER) + lastSeq;
}
2条答案
按热度按时间i86rm4rw1#
使用简单日期格式化程序将当前时间戳格式化为“yymmddhhmmss”,并使用全局变量获取该时间戳的序列号。
输出
watbbzwu2#
java.time文件
我建议您在日期和时间工作中使用java.time,即现代的java日期和时间api。这是一个这样做的建议。
在以下两种情况下,它会严重破裂:
如果在时钟倒转并重复相同时间的回弹期间使用。
如果jvm的时区发生了变化。您的程序的任何部分和运行在同一jvm中的任何其他程序都可以在任何时候这样做。
如果程序在2100年前运行,它还将提供不增加的ID。自从
LocalDateTime
包括全年,它将继续运行和给予身份证,虽然。为什么不试试呢?
在一个案例中,输出是:
链接
oracle教程:date time解释如何使用java.time。