最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

教你如何用Java根據(jù)日期生成流水號(hào)

 更新時(shí)間:2021年04月23日 15:32:56   作者:格子衫111  
這篇文章主要介紹了教你如何用Java根據(jù)日期生成流水號(hào),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下

前言

生成流水號(hào),在企業(yè)中可以說是比較常見的需求,尤其是訂單類業(yè)務(wù)。

一般來說,需要保證流水號(hào)的唯一性。

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

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

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

前綴:為了更好的標(biāo)識(shí)這個(gè)流水號(hào)是屬于哪種類型;

日期:為了防止重復(fù);

數(shù)字:為了表示當(dāng)前的流水所處序號(hào)。

需求:生成一個(gè)17位數(shù)的唯一流水號(hào),“LSH”+yyyyMMdd+6位數(shù)字

代碼實(shí)現(xiàn)

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("生成的流水號(hào):"+serialNo);
    }

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


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

        //將數(shù)值補(bǔ)足為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);
        //再拼接數(shù)字
        codeSb.append(numSb);
        return codeSb.toString();
    }


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

假如今天是2021年4月22日,運(yùn)行項(xiàng)目,生成的第1個(gè)流水號(hào)則為:LSH20210422000001

第2個(gè)流水號(hào)則為:LSH20210422000002,依次類推。

需要注意的是:

如果限制了位數(shù),6位數(shù)字每天最多能生成10w個(gè)流水號(hào),所以,這個(gè)數(shù)字位數(shù)根據(jù)具體業(yè)務(wù)量進(jìn)行調(diào)整。

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

到此這篇關(guān)于教你如何用Java根據(jù)日期生成流水號(hào)的文章就介紹到這了,更多相關(guān)java生成流水號(hào)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java解析php函數(shù)json_encode unicode 編碼問題

    java解析php函數(shù)json_encode unicode 編碼問題

    這篇文章主要介紹了java解析php函數(shù)json_encode unicode 編碼問題,需要的朋友可以參考下
    2016-04-04
  • java實(shí)現(xiàn)動(dòng)態(tài)數(shù)組

    java實(shí)現(xiàn)動(dòng)態(tài)數(shù)組

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)動(dòng)態(tài)數(shù)組,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • java實(shí)現(xiàn)圖書館管理系統(tǒng)

    java實(shí)現(xiàn)圖書館管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)圖書館管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • SpringBoot實(shí)現(xiàn)發(fā)送郵件任務(wù)

    SpringBoot實(shí)現(xiàn)發(fā)送郵件任務(wù)

    這篇文章主要為大家詳細(xì)介紹了SpringBoot實(shí)現(xiàn)發(fā)送郵件任務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • SpringBoot項(xiàng)目部署到服務(wù)器上的方法(Jar包)

    SpringBoot項(xiàng)目部署到服務(wù)器上的方法(Jar包)

    這篇文章主要介紹了SpringBoot項(xiàng)目部署到服務(wù)器上的方法(Jar包),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • SpringBoot使用Maven插件進(jìn)行項(xiàng)目打包的方法

    SpringBoot使用Maven插件進(jìn)行項(xiàng)目打包的方法

    這篇文章主要介紹了SpringBoot使用Maven插件進(jìn)行項(xiàng)目打包的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Spring JdbcTemplate執(zhí)行數(shù)據(jù)庫操作詳解

    Spring JdbcTemplate執(zhí)行數(shù)據(jù)庫操作詳解

    JdbcTemplate是Spring框架自帶的對(duì)JDBC操作的封裝,目的是提供統(tǒng)一的模板方法使對(duì)數(shù)據(jù)庫的操作更加方便、友好,效率也不錯(cuò),這篇文章主要介紹了Spring JdbcTemplate執(zhí)行數(shù)據(jù)庫操作,需要的朋友可以參考下
    2022-10-10
  • Java Arrays.AsList原理及用法實(shí)例

    Java Arrays.AsList原理及用法實(shí)例

    這篇文章主要介紹了Java Arrays.AsList原理及用法實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • SpringMVC JSON數(shù)據(jù)傳輸參數(shù)超詳細(xì)講解

    SpringMVC JSON數(shù)據(jù)傳輸參數(shù)超詳細(xì)講解

    有時(shí)候參數(shù)的傳遞還需要更多的參數(shù),比如一個(gè)獲取用戶信息的請(qǐng)求中既有用戶ID等基本參數(shù),還要求對(duì)查詢結(jié)果進(jìn)行分頁,針對(duì)這種場(chǎng)景,一般都會(huì)將分頁參數(shù)封裝成一個(gè)對(duì)象,然后將它和基本參數(shù)一起傳給控制器
    2023-02-02

最新評(píng)論

和田市| 天气| 铅山县| 泊头市| 太和县| 平顶山市| 禹州市| 曲松县| 华宁县| 宁远县| 固安县| 文昌市| 万宁市| 广灵县| 瑞昌市| 苍溪县| 太仆寺旗| 内江市| 晋城| 巴南区| 新晃| 文昌市| 余庆县| 城步| 巴南区| 阿瓦提县| 大渡口区| 曲周县| 罗田县| 麻阳| 巍山| 辉县市| 台江县| 临夏县| 晋江市| 临颍县| 平原县| 垣曲县| 景东| 右玉县| 景宁|