基于Java中当前日期格式yymmddHHmmss的唯一ID

基于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

我需要创建一个基于当前时间格式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 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;
}
它将在以下两种情况下惨败:

  • 如果在回弹过程中使用,则时钟将被转回,并重复相同的时间
  • 如果JVM的时区已更改。您的程序的任何部分以及在同一JVM中运行的任何其他程序都可以随时这样做
  • 如果该程序恰好在2100年新年前运行,它还将提供不增加的ID。由于
    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