1. 程式人生 > 其它 >Java開發技巧總結

Java開發技巧總結

技術標籤:後端Java基礎Javajava

一、根據身份證號獲取年齡

工具方法:

    /**
     * 根據身份證號計算年齡——預設與當前系統時間對比
     * @param pensonnelIdCard 身份證號
     * @return
     */
    public static Integer getPersonAgeFromIdCard1(String pensonnelIdCard) {
        Integer age = 0;

        try {
            //擷取身份證中出行人出生日期中的年、月、日
            Integer personYear = Integer.parseInt(pensonnelIdCard.substring(6, 10));
            Integer personMonth = Integer.parseInt(pensonnelIdCard.substring(10, 12));
            Integer personDay = Integer.parseInt(pensonnelIdCard.substring(12, 14));

            Calendar cal = Calendar.getInstance();
            // 得到當前時間的年、月、日
            Integer yearNow = cal.get(Calendar.YEAR);
            Integer monthNow = cal.get(Calendar.MONTH) + 1;
            Integer dayNow = cal.get(Calendar.DATE);

            // 用當前年月日減去生日年月日
            Integer yearMinus = yearNow - personYear;
            Integer monthMinus = monthNow - personMonth;
            Integer dayMinus = dayNow - personDay;

            age = yearMinus; //先大致賦值

            if (yearMinus == 0) { //出生年份為當前年份
                age = 0;
            }else{ //出生年份大於當前年份
                if (monthMinus < 0) {//出生月份小於當前月份時,還沒滿週歲
                    age = age - 1;
                }
                if (monthMinus == 0) {//當前月份為出生月份時,判斷日期
                    if (dayMinus < 0) {//出生日期小於當前月份時,沒滿週歲
                        age = age - 1;
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("身份證資訊有誤:" + pensonnelIdCard);
        }finally {
            return age;
        }
    }

    /**
     * 根據身份證號計算年齡——通過與指定時間對比
     * @param pensonnelIdCard 身份證號
     * @param date 指定的時間
     * @return
     */
    public static Integer getPersonAgeFromIdCard2(String pensonnelIdCard, Date date) {
        Integer age = 0;

        try {
            //擷取身份證中出行人出生日期中的年、月、日
            Integer personYear = Integer.parseInt(pensonnelIdCard.substring(6, 10));
            Integer personMonth = Integer.parseInt(pensonnelIdCard.substring(10, 12));
            Integer personDay = Integer.parseInt(pensonnelIdCard.substring(12, 14));

            Calendar cal = Calendar.getInstance();
            cal.setTime(date);
            // 得到當前時間的年、月、日
            Integer yearNow = cal.get(Calendar.YEAR);
            Integer monthNow = cal.get(Calendar.MONTH) + 1;
            Integer dayNow = cal.get(Calendar.DATE);

            // 用當前年月日減去生日年月日
            Integer yearMinus = yearNow - personYear;
            Integer monthMinus = monthNow - personMonth;
            Integer dayMinus = dayNow - personDay;

            age = yearMinus; //先大致賦值

            if (yearMinus == 0) { //出生年份為當前年份
                age = 0;
            }else{ //出生年份大於當前年份
                if (monthMinus < 0) {//出生月份小於當前月份時,還沒滿週歲
                    age = age - 1;
                }
                if (monthMinus == 0) {//當前月份為出生月份時,判斷日期
                    if (dayMinus < 0) {//出生日期小於當前月份時,沒滿週歲
                        age = age - 1;
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("身份證資訊有誤:" + pensonnelIdCard);
        }finally {
            return age;
        }
    }

main方法:

    public static void main(String[] args) throws ParseException {
        //根據身份證號計算年齡——預設與當前系統時間(2021.02.08)對比
        Integer age1 = getPersonAgeFromIdCard1("410523199202126017");

        System.out.println("根據身份證號計算年齡——預設與當前系統時間對比:" + age1);

        System.out.println("********************************");

        //根據身份證號計算年齡——通過與指定時間對比
        Date date=  new SimpleDateFormat("yyyy-MM-dd").parse("2000-02-12");
        Integer age2 = getPersonAgeFromIdCard2("410523199202126017", date);

        System.out.println("根據身份證號計算年齡——通過與指定時間對比:" + age2);
    }

執行結果:

二、BigDecimal使用注意事項

Bigdecimal型別的值進行除法運算時,需要考慮結果是否會出現無限迴圈小數,如果結果是無線迴圈小數,就會報錯,比如:

    public static void main(String[] args) {

        BigDecimal b1 = new BigDecimal("10");
        BigDecimal b2 = new BigDecimal("3");

        BigDecimal result = b1.divide(new BigDecimal("3"));

        System.out.println(b1 + "/" + b2 + "=" + result);
    }

結果:

解決方法:

    public static void main(String[] args) {

        BigDecimal b1 = new BigDecimal("10");
        BigDecimal b2 = new BigDecimal("3");

        //方法1:不設定精度
        BigDecimal result1 = b1.divide(new BigDecimal("3"), BigDecimal.ROUND_HALF_UP);
        System.out.println("方法1--->" + b1 + "/" + b2 + "=" + result1);
        //方法2:設定小數點兒保留兩位小數
        BigDecimal result2 = b1.divide(new BigDecimal("3"), 2, BigDecimal.ROUND_HALF_UP);
        System.out.println("方法2--->" + b1 + "/" + b2 + "=" + result2);
    }

執行結果:

補充:

roundingMode為小數模式;

ROUND_CEILING
如果 BigDecimal 是正的,則做 ROUND_UP 操作;如果為負,則做 ROUND_DOWN 操作。
ROUND_DOWN
從不在捨棄(即截斷)的小數之前增加數字。
ROUND_FLOOR
如果 BigDecimal 為正,則作 ROUND_UP ;如果為負,則作 ROUND_DOWN 。
ROUND_HALF_DOWN
若捨棄部分> .5,則作 ROUND_UP;否則,作 ROUND_DOWN 。
ROUND_HALF_EVEN
如果捨棄部分左邊的數字為奇數,則作 ROUND_HALF_UP ;如果它為偶數,則作 ROUND_HALF_DOWN 。
ROUND_HALF_UP
若捨棄部分>=.5,則作 ROUND_UP ;否則,作 ROUND_DOWN 。
ROUND_UNNECESSARY
該“偽舍入模式”實際是指明所要求的操作必須是精確的,,因此不需要舍入操作。
ROUND_UP
總是在非 0 捨棄小數(即截斷)之前增加數字。