Hutool-core笔记

返回上一级

克隆

    @Test
    public void fileTest(){
        try {
            Cat1 cat1 = new Cat1().clone();
            System.out.println(cat1.name);
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        Cat2 cat2 = new Cat2().clone();
        System.out.println(cat2.name);
        Cat3 cat3 = new Cat3().clone();
        System.out.println(cat3.list);

        // 深克隆,必须实现序列化接口,引用类型是新的,浅克隆两个对象使用同一个引用类型
        Cat3 cat31 = ObjectUtil.cloneByStream(new Cat3());
        System.out.println(cat31.list);
    }

    //使用jdk原生接口,没有强制实现克隆方法,要使用,调用方需要捕获异常
    public static class  Cat1 implements java.lang.Cloneable{
        private String name="cat1";

        @Override
        protected Cat1 clone() throws CloneNotSupportedException {
            return (Cat1) super.clone();
        }
    }

    //Hutool提供克隆接口,定义了一个方法,必须实现
    public static class Cat2 implements Cloneable<Cat2> {
        private String name="cat2";
        @Override
        public Cat2 clone() {
            try {
                return (Cat2) super.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
                throw new CloneRuntimeException(e);
            }
        }
    }

    // 提供继承类,可以不实现方法,父类直接实现好,但是必须是类没有继承其他类
    public static class Cat3 extends CloneSupport<Cat3> implements Serializable {
        private String name="cat3";
        private List<String> list= Arrays.asList("11","22");
    }

类型转换

    /**
     * 常用数据类型转换
     */
    @Test
    public void convertTest01(){
        // 类型转换
        Convert.toStr(1);
        // 数组转换
        String[] b = { "1", "2", "3", "4" };
        String str = Convert.toStr(b);
        Integer[] intArray = Convert.toIntArray(b);
        // 转日期
        String a = "2021-04-06";
        Date value = Convert.toDate(a);
        // 转集合
        Object[] c = {"a", "你", "好", "", 1};
        List<?> list = Convert.toList(c);
        // 转指定泛型集合,其他类型元素都会转成指定泛型
        Object[] d = { "a", "你", "好", "", 1 };
        List<String> strings = Convert.toList(String.class, d);
    }

    // 字符串 16进制互相转换
    @Test
    public void convertTest02(){
        // 转换必须传入编码格式
        String a="侯";
        String hex = Convert.toHex(a, CharsetUtil.CHARSET_UTF_8);
        System.out.println(hex);
        String raw = Convert.hexToStr(hex, CharsetUtil.CHARSET_UTF_8);
        System.out.println(raw);
    }

    // Unicode 字符串互相转换
    @Test
    public void convertTest03(){
        String a = "平安";
        String unicode = Convert.strToUnicode(a);
        System.out.println(unicode);// \u5e73\u5b89
        String raw = Convert.unicodeToStr(unicode);
    }

    @Test
    public void convertTest04(){
        // 编码转换
        String a = "我不是乱码";
        //转换后result为乱码, 从UTF_8转为ISO_8859_1
        String result = Convert.convertCharset(a, CharsetUtil.UTF_8, CharsetUtil.ISO_8859_1);
        String raw = Convert.convertCharset(result, CharsetUtil.ISO_8859_1, "UTF-8");
        System.out.println(raw);
    }

    @Test
    public void convertTest05(){
        // 时间单位转换,年月日时分秒换算等
        long a = 4535345;
        //秒->分
        long minutes = Convert.convertTime(a, TimeUnit.MILLISECONDS, TimeUnit.MINUTES);
    }

    @Test
    public void convertTest06(){
        // 金额大小写转换,只能转到分,再后面小数会被忽略
        double a = 67556.32;
        //陆万柒仟伍佰伍拾陆元叁角贰分
        String digitUppercase = Convert.digitToChinese(a);// 默认是繁体
        // 是否使用繁体字
        String numberToChinese = Convert.numberToChinese(a, false);
        // 六万七千五百五十六点三二
        System.out.println(numberToChinese);
    }

    /**
     * 半角符号和全角符号转换
     * 全角:占两个标注字符的位置
     * 半角:占一个标注字符的位置
     * 简单说:全角看起来有空格,半角没有
     */
    @Test
    public void convertTest07(){
        // 半角->全角
        String a = "1,2.3456789";
        String sbc = Convert.toSBC(a);
        System.out.println(sbc);
        // 全角->半角
        String b = "123456789";
        String dbc = Convert.toDBC(b);
        System.out.println(dbc);
    }

日期工具类

    // 日期转换
    @Test
    public void dateUtilTest01(){
        //获取当前时间三种方式
        Date date = DateUtil.date();
        Date date2 = DateUtil.date(Calendar.getInstance());
        Date date3 = DateUtil.date(System.currentTimeMillis());
        //当前时间字符串,格式:yyyy-MM-dd HH:mm:ss
        String now = DateUtil.now();
        //当前日期字符串,格式:yyyy-MM-dd
        String today= DateUtil.today();

        // 字符串转日期
        String dateStr = "2017-03-01";
        Date date4 = DateUtil.parse(dateStr, "yyyy-MM-dd");
        // 日期转字符串
        //结果 2017/03/01
        String format = DateUtil.format(date4, "yyyy/MM/dd");

        //常用格式的格式化,结果:2017-03-01
        String formatDate = DateUtil.formatDate(date);
        //结果:2017-03-01 00:00:00
        String formatDateTime = DateUtil.formatDateTime(date);
        //结果:00:00:00
        String formatTime = DateUtil.formatTime(date);
    }


    @Test
    public void dateUtilTest02(){
        // 获取日期某个部分
        Date date = DateUtil.date();
        //获得年的部分
        DateUtil.year(date);
        //获得月份,从0开始计数
        DateUtil.month(date);
        //获得月份枚举
        DateUtil.monthEnum(date);
        // 获取开始时间和结束时间
        String dateStr = "2017-03-01 22:33:23";
        Date date1 = DateUtil.parse(dateStr);

        //一天的开始,结果:2017-03-01 00:00:00
        Date beginOfDay = DateUtil.beginOfDay(date);

        //一天的结束,结果:2017-03-01 23:59:59
        Date endOfDay = DateUtil.endOfDay(date);
    }

    @Test
    public void dateUtilTest03(){
        // 时间偏移
        String dateStr = "2017-03-01 22:33:23";
        Date date = DateUtil.parse(dateStr);

        //结果:2017-03-03 22:33:23
        Date newDate = DateUtil.offset(date, DateField.DAY_OF_MONTH, 2);

        //常用偏移,结果:2017-03-04 22:33:23
        DateTime newDate2 = DateUtil.offsetDay(date, 3);

        //常用偏移,结果:2017-03-01 19:33:23
        DateTime newDate3 = DateUtil.offsetHour(date, -3);
        //当前时间简化API偏移
        //昨天
        DateUtil.yesterday();
        //明天
        DateUtil.tomorrow();
        //上周
        DateUtil.lastWeek();
        //下周
        DateUtil.nextWeek();
        //上个月
        DateUtil.lastMonth();
        //下个月
        DateUtil.nextMonth();

        // 时间差
        String dateStr1 = "2017-03-01 22:33:23";
        Date date1 = DateUtil.parse(dateStr1);
        String dateStr2 = "2017-04-01 23:36:55";
        Date date2 = DateUtil.parse(dateStr2);
        // 时间差: 单位  输出:31
        long betweenDay = DateUtil.between(date1, date2, DateUnit.DAY);
        System.out.println(betweenDay);
        // 格式化输出时间差
        //Level表示精确单位,如果为0 则不显示:
        String formatBetween = DateUtil.formatBetween(date1, date2, BetweenFormater.Level.SECOND);
        //输出:31天1小时3分32秒
        Console.log(formatBetween);
    }

    @Test
    public void dateUtilTest04(){
        // 计时器
        TimeInterval timer = DateUtil.timer();

        //-------这是执行过程

        timer.interval();//花费毫秒数
        timer.intervalRestart();//返回花费时间,并重置开始时间
        long minute = timer.intervalMinute();//花费分钟数

        // 星座和属相,年龄
        // 1月19 是 "摩羯座"
        String zodiac = DateUtil.getZodiac(Month.JANUARY.getValue(), 19);
        // "狗"
        String chineseZodiac = DateUtil.getChineseZodiac(1994);
        //年龄
        DateUtil.ageOfNow("1990-01-30");
        //是否闰年
        DateUtil.isLeapYear(2017);
    }

日期对象

/**
 * DateTime类继承于java.util.Date类,覆盖了toString()方法,
 * 返回yyyy-MM-dd HH:mm:ss形式的字符串,提供了众多便捷的方法对日期对象操作
 * 这些方法多是DateUtil静态方法的对象表现形式,使用DateTime对象可以完全替代开发中Date对象
 */
public class DateTimeTest {

    @Test
    public void test01(){
        // 构造器
        //new方式创建
        DateTime time = new DateTime(new Date());
        // 指定格式
        DateTime dateTime = new DateTime("2017-01-05 12:34:23", DatePattern.NORM_DATETIME_FORMAT);
        Console.log(time);
        //of方式创建
        DateTime now = DateTime.now();
        DateTime dt = DateTime.of(DateUtil.yesterday());
    }

    @Test
    public void test02(){
        DateTime dateTime = new DateTime("2021-01-05 12:34:23", DatePattern.NORM_DATETIME_FORMAT);

        //年,结果:2021
        int year = dateTime.year();

        //月份,结果:Month.JANUARY
        Month month = dateTime.monthEnum();

        //日,结果:5
        int day = dateTime.dayOfMonth();
    }

    @Test
    public void test03(){
        // DateTime对象默认是可变对象(调用offset、setField、setTime方法默认变更自身,还是原来的对象),
        // 可以调用setMutable(false)方法使其变为不可变对象。
        // 在不可变模式下,offset、setField方法返回一个新对象,setTime方法抛出异常。

        DateTime dateTime = new DateTime("2017-01-05 12:34:23", DatePattern.NORM_DATETIME_FORMAT);

        //默认情况下DateTime为可变对象,此时offset == dateTime
        DateTime offset = dateTime.offset(DateField.YEAR, 1);
        // 此时dateTime已经被改变,offset=dateTime
        System.out.println(dateTime);

        //设置为不可变对象后变动将返回新对象,此时offset != dateTime
        dateTime.setMutable(false);
        offset = dateTime.offset(DateField.YEAR, 0);
    }
}

中国日期

    @Test
    public void test01(){
        // 构造器
        //通过农历日期构建
        ChineseDate chineseDate = new ChineseDate(1992,12,14);
        //通过公历构建
        ChineseDate chineseDate1 = new ChineseDate(DateUtil.parseDate("1993-01-06"));
    }

    @Test
    public void test02(){
        //通过公历构建
        ChineseDate date = new ChineseDate(DateUtil.parseDate("2020-01-25"));
        // 一月
        date.getChineseMonth();
        // 正月
        date.getChineseMonthName();
        // 初一
        date.getChineseDay();
        // 庚子
        date.getCyclical();
        // 生肖:鼠
        date.getChineseZodiac();
        // 传统节日(部分支持,逗号分隔):春节
        date.getFestivals();
        // 庚子鼠年 正月初一
        date.toString();
        // 获取天干地支: 庚子年甲申月癸卯日
         date.getCyclicalYMD();
    }
posted @ 2021-05-13 07:53  侯小厨  阅读(1122)  评论(0编辑  收藏  举报
Fork me on Gitee