eclipse—基于java中当前日期格式yymmddhhmmss的唯一id

7uhlpewt  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(438)

我需要创建一个基于当前时间格式yymmddhhmmss+(序列0-9)的唯一id或参考号。我知道uuid,但我更喜欢这个。有人能教我怎么用java吗?谢谢。

i86rm4rw

i86rm4rw1#

使用简单日期格式化程序将当前时间戳格式化为“yymmddhhmmss”,并使用全局变量获取该时间戳的序列号。

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
watbbzwu

watbbzwu2#

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 包括全年,它将继续运行和给予身份证,虽然。
为什么不试试呢?

for (int i = 0; i < 12; i++) {
        System.out.println(getUniqueId());
        TimeUnit.MILLISECONDS.sleep(150);
    }

在一个案例中,输出是:

2104212202180
2104212202181
2104212202190
2104212202191
2104212202192
2104212202193
2104212202194
2104212202195
2104212202196
2104212202200
2104212202201
2104212202202

链接

oracle教程:date time解释如何使用java.time。

相关问题