栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java代码------常用工具类(尚马day14)Week4(3)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java代码------常用工具类(尚马day14)Week4(3)

1.日期类

1.1Date
1.2Calendar

特定的日历的时间。    抽象类


public class CalenderDemo {
    public static void main(String[] args) {
        //1.创建Calender对象
        Calendar calendar = Calendar.getInstance();       //拿到系统当前此刻的日历时间
        System.out.println(calendar);

        //2.获得具体时间单位的数据  get(int filed属性)  属性可用Calender类里的属性
        System.out.println(calendar.get(Calendar.YEAR));  //2022
        System.out.println(calendar.get(Calendar.MONTH)+1); //2       月份需要加1,才是当前月份

        System.out.println(calendar.get(Calendar.DAY_OF_MONTH));  //27
        System.out.println(calendar.get(Calendar.DATE));  //27

        System.out.println(calendar.get(Calendar.DAY_OF_WEEK));  //1    这一周的第五天,国外周日是第一天

        //3.与date的相互转换
        //Calender转date    用的getTime(),返Date
        Date time = calendar.getTime();
        System.out.println(time); //Sun Feb 27 12:27:50 CST 2022

        //date转Calender   首先得有Date对象  然后还要有Calender实例  再用Calender的setTime(Date date)方法
        Date date = new Date();
        Calendar calendar1 = Calendar.getInstance();
        calendar1.setTime(date);

        //4.修改时间  set方法  或者add方法
        //使用set
        calendar.set(2020,Calendar.MONTH,1,12,30,30);
        //月份不要写死,想改成2月,就得写成1月。最好用其常量维护(1-12月份是0-11的标识)
        //之后查看日期,将变为修改后的日期

        //add方法 add(int field,int amout) 现在要求从当前时间往后加10天
        calendar.add(Calendar.DATE,10);
        //若用set去做,set(int field,int value)
        calendar.set(Calendar.DAY_OF_MONTH,calendar.get(Calendar.DAY_OF_MONTH)+10);
        
    }
}

1.3LocalDate/LocalDateTime
public class Emp {
    private Integer id;
    private LocalDate hireDate;  //员工出生时间
    private LocalDate birthday;  //员工生日
    private LocalDateTime create_time;  //员工创建时间
    private LocalDateTime update_time; //员工信息修改时间

}

public class LocalDateDemo {
    public static void main(String[] args) {
        //LocalDate 用final修饰(没有子类),构造私有(不能new)  肯定用静态方法拿
        //1.获得LocalDate实例  用LocalDate的静态方法,很多方法都返的实例   now()   或者   of
        LocalDate now = LocalDate.now();
        System.out.println(now);  //2022-02-27     获得当前时间

        //of(年,月,日)  一个全是int,一个月是Month类(枚举类),推荐用常量去写,不要写死
        LocalDate localDate = LocalDate.of(2022, Month.MAY, 1);
        System.out.println(localDate);  //2022-05-01

        //2.拿年,月,日
        System.out.println(now.getYear());         //2022
        System.out.println(now.getMonth());        //FEBRUARY  拿枚举的
        System.out.println(now.getMonthValue());   //2    拿整型的
        System.out.println(now.getDayOfMonth());   //27

        //3.修改时间  plus加  minus减
        now.plusDays(20);    //这样做,不会加20天,值不可变。要想改变,要重新赋值
        System.out.println(now);  //2022-02-27
        now = now.plusDays(20);  //和String一样
        System.out.println(now);  //2022-03-19

        //看plus带两参数的  plus(amountToAdd , TemporalUnit一个接口,用于限定)
        now = now.plus(20, ChronoUnit.DAYS);
        System.out.println(now);  //2022-04-08

        //plus带一个参的 plus(TemporalAmount一个接口,时间间隔)
        now = now.plus(Period.ofDays(20));
        System.out.println(now);  //2022-04-28

        //4.求两个日期的时间间隔  until方法
        //until(ChronoLocalDate)
        Period period = localDate.until(now);
        System.out.println(period);  //P-3D   (Y年  M月  D日)

        //until(Temporal ,TemporalUnit )
        long days = now.until(localDate, ChronoUnit.DAYS);
        System.out.println(days);  //3

    }
}

1.4 Instant
public class InstantDemo {
    public static void main(String[] args) {
        Instant now = Instant.now();  //拿的UTC(格林尼日时间)的时间,与中国时间差8小时
        System.out.println(now);  //2022-02-27T06:28:56.359890900Z

        //求中国时间
        now = now.plus(Duration.ofHours(8));   //操作年月日用period   时分秒用Duration
        System.out.println(now);  //2022-02-27T14:30:25.811234200Z

        //加时间
        now = now.plusSeconds(Duration.ofHours(8).getSeconds()) ;  //括号里是8小时转秒数
    }
}

2.格式化类Format


2.1格式化日期类DateFormat


(1)SimpleDateFormat


(2)DateTimeFormatter


@Data
public class DateTimeFormatterDemo {

    private static  final  String PATTERN = "yyyy-MM-dd HH:mm:ss";       //创建时间格式
    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(PATTERN);
    public static void main(String[] args) {

        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println(localDateTime);  //2022-02-27T14:42:58.061979600

        //不希望有T,和毫秒数,只要年月日和时分秒
        //localDateTime 转String
        String format = FORMATTER.format(localDateTime);
        System.out.println(format);   //2022-02-27 14:51:10

        System.out.println("----------------------------------------");
        //String转LocalDateTime
        String create_time = "2022-02-27 14:51:10";
        Emp emp = new Emp();
        //emp.setCreate_time(create_time);  这里不能直接转

        //字符串转哪一个Local对象,就调用这个类里的parse方法
        LocalDateTime localDateTime1 = LocalDateTime.parse(create_time,FORMATTER);   //必须用parse()带两个参数的
        emp.setCreate_time(localDateTime1);
        System.out.println(localDateTime1);  //2022-02-27T14:51:10

        System.out.println("============================================");
        //String转LocalDate   也是parse,一个参两个参都行
        String birthday = "2021-01-01";
        emp.setBirthday(LocalDate.parse(birthday));
        System.out.println(emp);

    }
}

2.2格式化数字NumberFormat

一般针对小数和整数格式化,结果为字符串类型

何时用:1.保留小数点后几位   2.将小数转换成百分制   3.格式化钱数


public class DecimalDemo {
    public static void main(String[] args) {
        //保留两位小数
        NumberFormat numberFormat = new DecimalFormat(".00");    //.##也可以
        NumberFormat numberFormat1 = new DecimalFormat("00000.00"); //代表小数点前有5个数字
        NumberFormat numberFormat2 = new DecimalFormat("#####.00");

        double num = 100.56789;
        String result = numberFormat.format(num);   //结果为字符串类型
        System.out.println(result);       //100.57

        String result1 = numberFormat1.format(num);
        System.out.println(result1);    //00100.57    不够用0填充

        String result2 = numberFormat2.format(num);
        System.out.println(result2);       //100.57
    }
}

public class DecimalDemo2 {
    public static void main(String[] args) {
        //百分数   在格式化对象时加个百分号即可
        double num = 0.56789;
        NumberFormat numberFormat = new DecimalFormat(".##%");   //格式化对象
        String result = numberFormat.format(num);
        System.out.println(result);  //56.79%  (四舍五入了)

        //格式化金钱   每三个一个逗号   若钱太大,还会从小数点分成两部分
        double money = 18546546465.32165416565;
        NumberFormat numberFormat1 = new DecimalFormat("#,###.#### ");   //格式化对象
        String result1 = numberFormat1.format(money);
        System.out.println(result1);  //18,546,546,465.3217

    }
}


3.随机数类 Random

ThreadLocalRadom 随机数  是Random的子类


public class RandomDemo {
    public static void main(String[] args) {

        for(int i=0;i<5;i++){
            Random random = new Random();   //seed:当前纳秒数(时间会一直变)   无参
            for(int j= 0;j<5;j++){
                int num = random.nextInt(100);  //产生0-100之间的随机整数,包头不包尾
                System.out.print(num+",");
            }
            System.out.println();
        }

        System.out.println("-----------------");
        //伪随机:种子一致时,数值可预测
        for(int i=0;i<5;i++){
            Random random1 = new Random(100);   //seed:100            有参
            for(int j= 0;j<5;j++){
                int num = random1.nextInt(100);  //产生0-100之间的随机整数,包头不包尾
                System.out.print(num+",");
            }
            System.out.println();
        }

        ThreadLocalRandom random = ThreadLocalRandom.current();
        int i = random.nextInt(1000, 10000);  //拿1000-10000的随机数,包头不包尾
        
    }
}


4.编码解码类

编码: 加密  看的懂得数据转化成看不懂的数据  (路径,参数,基本信息)

解码: 解密  看不懂的数据转换成看得懂的数据


4.1base64(1.8之后)

前台数据传输用的比较多


public class base64Demo {
    private static final String ENCODING = "utf-8";   //加密规则

    public static void main(String[] args) {
        //用户注册 对密码执行加密处理
        userRegister();

        //用户登录,对注册时加密的密码解码处理
        //userLogin();
    }

    private static boolean userLogin() {
        Scanner input = new Scanner(System.in);
        System.out.println("登录用户姓名:");
        String name = input.next();
        System.out.println("登录用户密码:");
        String pass = input.next();

        //登录时,系统会拿注册时的用户名和密码进行比对,假设已拿到
        String regName = "admin";
        String regPass = "MTIzNDU2";

        //获得解码器
        base64.Decoder decoder = base64.getDecoder();
        byte[] decode = decoder.decode(regPass);
        //字节数组转字符串
        String decodepass = new String(decode,Charset.forName(ENCODING));
        if(!Objects.equals(regName,name) || !Objects.equals(decodepass,pass)){
            return false;
        }
        return true;
    }

    private static void userRegister() {
        Scanner input = new Scanner(System.in);
        System.out.println("请录入用户姓名:");    //admin
        String name = input.next();
        System.out.println("请录入用户密码:");    //123456
        String pass = input.next();

        //密文操作:对原密码加密处理
        //获得编码器
        base64.Encoder encoder = base64.getEncoder();
        //开始编码  encodeToString(byte )   需要字符串转字节数组
        pass = encoder.encodeToString(pass.getBytes(Charset.forName(ENCODING )));

        // name—pass
        String info = String.join("-",name,pass);
        System.out.println("用户注册成功,数据已经成功保存 ");
        System.out.println(info);                   //admin-MTIzNDU2

    }
}

4.2信息摘要算法 MessageDigest

抽象类,无子类,用静态方法实现

加密之后是16进制的字符串,该加密不可逆,无法破解。


public class MD5Util {

    private MD5Util(){   //构造私有化
    }
    private static final String[] ARRAY = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
    public static String md5EncodeStr(String sourceStr){

        Objects.requireNonNull(sourceStr);
        StringBuilder builder = new StringBuilder();
        try {
            //1.创建信息摘要的对象
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");   //括号里是加密规则,大小写不区分。检测括号里是否为加密规则,还是随意一个字符串,加一个try...catch...
           //2.更新加密  将源数据提交到加密规则中
            messageDigest.update(sourceStr.getBytes(Charset.forName("utf-8")));
            //3.加密操作
            byte[] bytes = messageDigest.digest();
            //4.字节转字符串
            //System.out.println("加密之后的数据:" + new String(bytes, Charset.forName("utf-8")));
            //将每个字节转换成16进制数据,再拼接成字符串
            //16进制从0-F  一个字节占8个二进制位   一个16进制数字占4个二进制位
            //字节转16进制,一个字节要换成两个16进制内容
            //高低位
            for(byte aByte:bytes){
                 builder.append(byteToHexStr(aByte)); 
            }
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return builder.toString();
    }

    private static String byteToHexStr(byte aByte) {
        int num = aByte;   //先转为整型
        if(num<0){               //aByte是小数,则补码
            num+=256;
        }
        //高位和低位的运算
        int lowIndex = num%16;
        int highIndex = num/16;

        return ARRAY[highIndex]+ARRAY[lowIndex];
    }

    public static void main(String[] args) {
        System.out.println(md5EncodeStr("1234"));
    }

}

public class MD5Util {

    private MD5Util(){   //构造私有化
    }
    private static final String[] ARRAY = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
    public static String md5EncodeStr(String sourceStr){

        Objects.requireNonNull(sourceStr);
        try {
            //1.创建信息摘要的对象
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");   //括号里是加密规则,大小写不区分。检测括号里是否为加密规则,还是随意一个字符串,加一个try...catch...
           //2.更新加密  将源数据提交到加密规则中
            messageDigest.update(sourceStr.getBytes(Charset.forName("utf-8")));
            //3.加密操作
            byte[] bytes = messageDigest.digest();
            //4.字节转字符串
            //System.out.println("加密之后的数据:" + new String(bytes, Charset.forName("utf-8")));
            //将每个字节转换成16进制数据,再拼接成字符串
            //16进制从0-F  一个字节占8个二进制位   一个16进制数字占4个二进制位
            //字节转16进制,一个字节要换成两个16进制内容
            //高低位
            BigInteger bigInteger = new BigInteger(1,bytes);    //调用number的一个子类   1代表将字节数组转成一个正整数
            return bigInteger.toString(16);

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {
        System.out.println(md5EncodeStr("1234"));
    }

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/749473.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号