91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用Java根據日期生成流水號

發布時間:2021-04-26 14:53:14 來源:億速云 閱讀:887 作者:小新 欄目:開發技術

這篇文章主要介紹怎么用Java根據日期生成流水號,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

Java的優點是什么

1. 簡單,只需理解基本的概念,就可以編寫適合于各種情況的應用程序;2. 面向對象;3. 分布性,Java是面向網絡的語言;4. 魯棒性,java提供自動垃圾收集來進行內存管理,防止程序員在管理內存時容易產生的錯誤。;5. 安全性,用于網絡、分布環境下的Java必須防止病毒的入侵。6. 體系結構中立,只要安裝了Java運行時系統,就可在任意處理器上運行。7. 可移植性,Java可以方便地移植到網絡上的不同機器。8.解釋執行,Java解釋器直接對Java字節碼進行解釋執行。

生成流水號,在企業中可以說是比較常見的需求,尤其是訂單類業務。

一般來說,需要保證流水號的唯一性。

如果沒有長度和字符的限制,那么直接使用UUID生成一個唯一字符串即可,也可以直接使用數據庫表中的主鍵,主鍵就是唯一的。

那么,如果限制了流水號必須多少位,這種怎么生成呢?

可以采用"前綴+日期+數字"的方式(ps:此方式是需要用到緩存的)

前綴:為了更好的標識這個流水號是屬于哪種類型;

日期:為了防止重復;

數字:為了表示當前的流水所處序號。

需求:生成一個17位數的唯一流水號,“LSH”+yyyyMMdd+6位數字

代碼實現

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.concurrent.atomic.AtomicInteger;

public class SerialNoTest {

    public static void main(String[] args) {
        String serialNo = generateSerialNo();
        System.out.println("生成的流水號:"+serialNo);
    }

    /**
     * 生成17位唯一流水號,"LSH"+yyyyMMdd+6位數字
     * 6位數字,如:000001
     * @return
     */
    private static String generateSerialNo(){
        //定義需要返回的流水號
        String serialNo = null;
        //先查詢到今天的日期,格式:"yyyyMMdd"
        String todayDate = new SimpleDateFormat("yyyyMMdd")
                                .format(new Date());
        //固定字母前綴 拼接 今天日期,組成新的完整的前綴,也就是緩存的key
        String cacheKey = "LSH"+todayDate;
        //再通過key查詢緩存有沒有num數據,緩存操作根據自身項目封裝工具類
        Long codeNum = cacheService.getCache(cacheKey, Long.class);
        //如果緩存查詢有值,數值+1,再賦值給下一個流水號
        if (null != codeNum) {
            codeNum = codeNum + 1L;
        } else {
            //如果緩存查詢沒值,直接賦值為1
            codeNum = 1L;
        }
        //流水號 = 緩存key + 拼接的數值 = 前綴 + 日期 + 拼接的數值
        serialNo = getCodeOfSix(cacheKey, codeNum.intValue());
        //設置緩存,調用此方法,會自動將key所對應的value+1,保存時長:今天剩余的時間
        cacheService.incr(cacheKey, getSeconds());
        return serialNo;
    }


    /**
     * 將數值拼接成對應的位數
     * @param prefix  前綴:"LSH"+yyyyMMdd
     * @param nowNum  當前要生成的數字
     * @return 拼接好的流水號
     */
    public static String getCodeOfSix(String prefix,int nowNum ) {
        //需要返回的code
        StringBuilder codeSb = new StringBuilder();
        //需要拼接的數字
        StringBuilder numSb = new StringBuilder();
        //封裝的數字對象,里面 value 加了 volatile關鍵字,保證了線程安全
        AtomicInteger count = new AtomicInteger(nowNum);

        //將數值補足為6位字符串
        if (count.get() < 10) {
            numSb.append("00000").append(count.get());
        } else if(count.get() < 100){
            numSb.append("0000").append(count.get());
        }else if(count.get() < 1000){
            numSb.append("000").append(count.get());
        }else if(count.get() < 10000){
            numSb.append("00").append(count.get());
        }else if(count.get() < 100000){
            numSb.append("0").append(count.get());
        } else if (count.get() >= 100000) {
            numSb.append(count.get());
        }

        //先拼接前綴
        codeSb.append(prefix);
        //再拼接數字
        codeSb.append(numSb);
        return codeSb.toString();
    }


    /**
     * 獲取當天結束還剩余多少秒
     * @return
     */
    public static int getSeconds(){
		//獲取今天當前時間
        Calendar curDate = Calendar.getInstance();
		//獲取明天凌晨0點的日期
        Calendar tommorowDate = new GregorianCalendar(
                curDate.get(Calendar.YEAR),
                curDate.get(Calendar.MONTH), 
                curDate.get(Calendar.DATE) + 1,
                0, 0, 0);
		//返回 明天凌晨0點 和 今天當前時間 的差值(秒數) 
        return (int)(tommorowDate.getTimeInMillis() - curDate .getTimeInMillis()) / 1000;
    }
}

假如今天是2021年4月22日,運行項目,生成的第1個流水號則為:LSH20210422000001

第2個流水號則為:LSH20210422000002,依次類推。

需要注意的是:

如果限制了位數,6位數字每天最多能生成10w個流水號,所以,這個數字位數根據具體業務量進行調整。

如果每天的生成數量量不到1w,那么使用4位數字即可。

以上是“怎么用Java根據日期生成流水號”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

蓬安县| 茌平县| 杭州市| 罗平县| 崇义县| 沿河| 霞浦县| 古交市| 临高县| 嘉荫县| 都兰县| 东辽县| 柘荣县| 昆明市| 高雄市| 丰宁| 油尖旺区| 赤峰市| 营口市| 饶阳县| 兰坪| 乐山市| 池州市| 滨海县| 灯塔市| 顺平县| 安多县| 常山县| 偏关县| 宜宾县| 龙井市| 大埔区| 二连浩特市| 新竹市| 根河市| 西林县| 遵化市| 滨海县| 周宁县| 岚皋县| 达日县|