基于Java中当前日期格式yymmddHHmmss的唯一ID
我需要创建一个基于当前时间格式yymmddHHmmss+(序列0-9)的唯一ID或参考号。我知道UUID,但我更喜欢这个。有人能告诉我如何用Java做吗?谢谢。使用简单日期格式化程序将当前时间戳格式化为“yymmddhmmss”,并使用全局变量获取该时间戳的序列号基于Java中当前日期格式yymmddHHmmss的唯一ID,java,eclipse,date,unique-id,Java,Eclipse,Date,Unique Id,我需要创建一个基于当前时间格式yymmddHHmmss+(序列0-9)的唯一ID或参考号。我知道UUID,但我更喜欢这个。有人能告诉我如何用Java做吗?谢谢。使用简单日期格式化程序将当前时间戳格式化为“yymmddhmmss”,并使用全局变量获取该时间戳的序列号 private static final int MIN_SEQ = 0; private static final int MAX_SEQ = 9; private String lastDate = new SimpleDate
private static final int MIN_SEQ = 0;
private static final int MAX_SEQ = 9;
private String lastDate = new SimpleDateFormat("yyMMddHHmmss").format(new Date());
private int lastSequence = 0;
private static String getUID()
{
String currentDateTime = new SimpleDateFormat("yyMMddHHmmss").format(new Date());
if (currentDateTime.equals(lastDate))
{
lastSequence++;
}
else
{
lastDate = currentDateTime;
lastSequence = MIN_SEQ;
}
if (lastSequence > MAX_SEQ)
{
throw new IllegalStateException("Sequence numbers out of range.!");
}
return lastDate + lastSequence;
}
输出
2104211714401
2104211714402
2104211714403
2104211714404
2104211714405
2104211714406
2104211714410
2104211714411
2104211714412
2104211714413
2104211714414
java.time
我建议您在日期和时间工作中使用java.time,即现代java日期和时间API。这里有一个这样做的建议
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;
}
它将在以下两种情况下惨败:
LocalDateTime
包含全年,因此它将继续运行并提供ID
为什么不试试呢
for (int i = 0; i < 12; i++) {
System.out.println(getUniqueId());
TimeUnit.MILLISECONDS.sleep(150);
}
链接
解释如何使用java.time。这有帮助吗?你不是在几天前问过同样的问题吗?如果你真的想要一个通用的唯一标识符,你真的应该使用一个。使用UUID可以避免在正确的文档中提到的有问题的情况。UUID在每分之一秒处理的序列号比每秒10个的粒度要多得多。UUID是标准的,很容易被熟练的程序员和系统管理员识别和理解,并且可以与其他系统进行互操作。只是,它是1-9之间的序列,而不是随机序列。这意味着第一个生成的ID从1开始,第二个是2,依此类推。。。最多10个。您可以定义一个值为1的全局变量,并在每次添加日期后递增该值。我使用此代码。我不确定它是否会增加,因为我不能测试它。对于(int i=1;我请不要教年轻人使用早已过时且臭名昭著的
SimpleDateFormat
类。至少不是第一个选项。而且不是毫无保留的。我们有更好的in及其DateTimeFormatter
。
2104212202180
2104212202181
2104212202190
2104212202191
2104212202192
2104212202193
2104212202194
2104212202195
2104212202196
2104212202200
2104212202201
2104212202202