【问题标题】:Unique ID based on Current Date Format yymmddHHmmss in JavaJava中基于当前日期格式yymmddHHmmss的唯一ID
【发布时间】:2021-04-21 11:57:15
【问题描述】:

我需要创建一个基于当前时间格式 yymmddHHmmss +(序列 0-9)的唯一 ID 或参考号。我知道 UUID,但我更喜欢这个。有人可以告诉我如何在 Java 中做到这一点吗?谢谢。

【问题讨论】:

标签: java eclipse date unique-id


【解决方案1】:

java.time

我建议您使用现代 Java 日期和时间 API java.time 进行日期和时间工作。这是一个这样做的建议。

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;
}

在以下两种情况下会惨败:

  1. 如果在回弹期间使用,时钟会倒转并重复相同的时间。
  2. 如果您的 JVM 的时区已更改。您的程序的任何部分以及在同一 JVM 中运行的任何其他程序都可以随时执行此操作。

如果程序恰好在 2100 年新年之前运行,它也会提供非增加的 ID。由于 LocalDateTime 包括全年,它会继续运行并提供 ID。

为什么不试试呢?

    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 tutorial: Date Time 解释如何使用 java.time。

【讨论】:

    【解决方案2】:

    使用简单的日期格式化程序将当前时间戳格式化为“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
    

    【讨论】:

    • 这行得通。只是,它是从 1 到 9 的序列,而不是随机的。这意味着第一个生成的ID从1开始,第二个是2等等......直到10。
    • 您可以定义一个值为1的全局变量,并在每次附加日期后递增该值。
    • 我使用这个代码。我不确定它是否会增加,因为我无法测试它。 for (int i = 1 ; i
    • 请不要教年轻人使用早已过时且臭名昭著的SimpleDateFormat类。至少不是第一选择。而且不是没有任何保留。我们在java.time, the modern Java date and time API, 和它的DateTimeFormatter 中做得更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多