教你如何用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根据日期生成流水号的文章就介绍到这了,更多相关java生成流水号内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java使用iTextPDF生成PDF文件的实现方法

    iText介绍和说明 因为项目需要生成PDF文件,所以去找了一下能够生成PDF的Java工具,看到了iText可以说好评如潮. 如果你想通过java操作PDF文件,那么 iText 绝对是你的首选. 引入依赖 这里使用的是iText5 <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.10</ve

  • java使用Abobe Acrobat DC生成模板

    一.利用word生成一个文档转成pdf 说明:转换成pdf格式 二.Abobe Acrobat DC图解 利用Abobe Acrobat DC打开pdf 步骤:文件 ---->创建------>创建表单----->选择文件(你转换成pdf文件) 这里是所要增加的文本域.图片域等功能按钮 在你需要的位置增加你说要的功能完成之后进行保存 三.java后台代码 环境maven <dependency> <groupId>com.itextpdf</groupId&

  • 使用cmd根据WSDL网址生成java客户端代码的实现

    windows下使用cmd命令提示符生成java webservice客户端代码,可以使用命令提示符直接生成客户端代码,直接导入到项目中,只需配置jdk即可,在jdk的bin文件夹下,按Shift并点击右键,选中"在此处打开命令窗口" 输入命令如下: wsimport -keep -p com.demo.client -d D:\\(存放的地址) http://XX/Account?wsdl(wsdl地址) 命令参数说明: -d:生成客户端执行类的class文件的存放目录(默认存放在C

  • Eclipse+Java+Swing实现学生成绩管理系统的实例代码

    一.系统介绍 本系统实现了用户登录,实现了对学生成绩的增删改查,实现了用户修改密码功能,采用MD5加密算法,数据库使用Mysql8.0.13,界面良好. 二.系统展示 1.登录页 2.主页面 3.查询学生成绩 4.修改学生成绩 5.添加学生成绩 6.修改系统密码 三.系统实现 Student.java package com.sjsq.model; import java.util.ArrayList; import java.util.List; /** * 学生实体类 * @author s

  • Java基于Javafaker生成测试数据

    1. 前言 老板说,明天甲方要来看产品,你得造点数据,而且数据必须是"真"的,演示效果要好看一些,这样他才会买我们的产品,我好明年给你换个嫂子.一般开发接到这种过分要求都不会很乐意去做,这完全是体力劳动,而且很棘手.今天胖哥教你一招,让你做出逼真的"假"数据. 2. javafaker 我们Java是有可以生成仿真数据的框架的,这里我安利一个Javafaker的框架,你只需要在项目中引入: <dependency> <groupId>com.

  • 超简洁java实现双色球若干注随机号码生成(实例代码)

    Mavan pom文件引用依赖 <!-- hutool工具类--> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.3.6</version> </dependency> <!-- google java类库--> <dependency> <

  • Java 生成带Logo和文字的二维码

    ZXing 是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口.Zxing 可以实现使用手机的内置的摄像头完成条形码的扫描及解码.本章讲解用 ZXing 生成和扫码二维码. 依赖 在Java项目中pom.xml加入: <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version&g

  • java自动生成编号的实现(格式:yyMM+四位流水号)

    本篇文章主要介绍了java自动生成编号的实现,分享给大家,具体如下 /** * 自动生成编号格式:yyMM+四位流水号 */ @RequestMapping(params = "createCode") @ResponseBody public AjaxJson createCode(HttpServletRequest request, String tableName, String fieldName) { AjaxJson j = new AjaxJson(); String

  • java高并发情况下高效的随机数生成器

    前言 在代码中生成随机数,是一个非常常用的功能,并且JDK已经提供了一个现成的Random类来实现它,并且Random类是线程安全的. 下面是Random.next()生成一个随机整数的实现: protected int next(int bits) { long oldseed, nextseed; AtomicLong seed = this.seed; do { oldseed = seed.get(); nextseed = (oldseed * multiplier + addend)

  • 教你如何用Java根据日期生成流水号

    前言 生成流水号,在企业中可以说是比较常见的需求,尤其是订单类业务. 一般来说,需要保证流水号的唯一性. 如果没有长度和字符的限制,那么直接使用UUID生成一个唯一字符串即可,也可以直接使用数据库表中的主键,主键就是唯一的. 那么,如果限制了流水号必须多少位,这种怎么生成呢? 可以采用"前缀+日期+数字"的方式(ps:此方式是需要用到缓存的) 前缀:为了更好的标识这个流水号是属于哪种类型: 日期:为了防止重复: 数字:为了表示当前的流水所处序号. 需求:生成一个17位数的唯一流水号,&

  • 教你如何用Java替换Word中带有${}的内容

    一.概述 1.因为有些需求,需要把word文档里面的特定数据,设置成可变的:所以需要某种方式,把可变量用标签(如${变量名})替换,通过后端赋值此变量名,重新生成的Word就能根据后端设置的内容变化. 2.替换方法:准备一份word模板文档,如:word_mode.doc(或 word_mode.docx) 文件,把可变内容,用标签${变量名}替换(如图1姓名:${name}) 3.转成可读模板:全部设置完变量标签后,对此word文档进行另存为xml格式的文档(图2),保存后的文件名:word_

  • 教你如何用Java简单爬取WebMagic

    一.Java爬虫--WebMagic 1.1 WebMagic总体架构图 1.2 WebMagic核心组件 1.2.1 Downloader 该组件负责从互联网上下载页面.WebMagic默认使用Apache HttpClient作为下载工具. 1.2.2 PageProcessor 该组件负责解析页面,根据我们的业务进行抽取信息.WebMagic使用Jsoup作为HTML解析工具,并基于其开发了解析Xpath的工具Xsoup. 1.2.3 Scheduler 该组件负责管理待抓取的URL,以及

  • 教你怎么用java一键自动生成数据库文档

    这是该工具的github地址:https://github.com/pingfangushi/screw 一.引入pom.xml依赖 <dependencies> <!-- screw 库,简洁好用的数据库表结构文档生成器 --> <dependency> <groupId>cn.smallbun.screw</groupId> <artifactId>screw-core</artifactId> <version

  • 一篇文章教你如何用Java自定义一个参数校验器

    目录 注解 校验器 异常处理 测试 总结 自定义一个唯一字段校验器 注解 @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Constraint(validatedBy = {IsUniqueValidator.class}) // 指定自定义的校验器 public @interface IsUnique { // 提示信息 String message() default "";

  • 教你如何用好 Java 中的枚举

    目录 1.概览 2.自定义枚举方法 3.使用 == 比较枚举类型 4.在 switch 语句中使用枚举类型 6.EnumSet and EnumMap 6.1. EnumSet 6.2. EnumMap 7. 通过枚举实现一些设计模式 7.1 单例模式 7.2 策略模式 8. Java 8 与枚举 9. Enum 类型的 JSON 表现形式 10. 补充 1.概览 enum关键字在 java5 中引入,表示一种特殊类型的类,其总是继承java.lang.Enum类,更多内容可以自行查看其官方文档

  • 手把手教你使用Java实现在线生成pdf文档

    目录 一.介绍 二.案例实现 2.1添加iText依赖包 2.2简单实现 2.3复杂实现 2.4变量替换方式 三.总结 一.介绍 在实际的业务开发的时候,研发人员往往会碰到很多这样的一些场景,需要提供相关的电子凭证信息给用户,例如网银/支付宝/微信购物支付的电子发票.订单的库存打印单.各种电子签署合同等等,以方便用户查看.打印或者下载. 例如下图的电子发票! 熟悉这块业务的童鞋,一定特别清楚,目前最常用的解决方案是:把相关的数据信息,通过一些技术手段生成对应的 PDF 文件,然后返回给用户,以便

  • SpringBoot如何用java生成静态html

    目录 SpringBoot集成Freemarker 1. 引入Maven依赖 2. 创建ftl 3. 创建freeMarker工具类 4. 编写Java的代码 5. Html输出 SpringBoot集成Freemarker 主要特征:静态页面,无接口交互 数据实时性不高且体量小的网站可采用生成静态html的形式 数据提前渲染至html内,若发生数据更新,则重新渲染数据 CDN加速让网站不再龟速 1. 引入Maven依赖 <dependency>     <groupId>org.

  • 教你如何用Jenkins自动化部署项目(从零到搭建完成)

    最近在实习中接触了jenkins这个东西,所以花点时间了解了下.它可以在代码上传仓库(如github,gitee,gitlab)后,在jenkins(一个网站界面)中通过获取代码仓库中最新代码,进行自动化部署,而省去手动打包.上传服务器.部署这一系列步骤,非常方便. 下面教程分为以下几个部分: 一.在你的本地电脑或者linux服务器上下载安装jenkins: jenkins下载地址:https://jenkins.io/  下载网站的war包版本就好了 下载完后把它部署到你的tomcat上运行:

  • 教你如何用Eclipse创建一个Maven项目

    一.Maven的安装与设置环境变量 想要创建一个Maven项目需要先安装Maven,并且设置好环境变量 1.去下载Maven 2.设置环境变量 新建变量MAVEN_HOME,值为Maven的目录X:\XXX\apache-maven-XXX 将%MAVEN_HOME%\bin添加到Path变量下 3.运行CMD,输入mvn -v后可以看到Maven的版本信息等则表示安装成功 二.创建Maven项目和依赖 2.1 创建Maven项目的两种方式 第一种创建方式:使用命令行手动创建 mvn arche

随机推荐