這樣纔是寫工具類

在這裏插入圖片描述

文章講的很淺,道理大家都懂。寫出來,是爲了更好的貫徹它!

與君共勉
什麼是工具類?

在這裏插入圖片描述
這種 低級的問題還問的出來。

最近我發現 好多東西都是一看就懂。然而,自己不知道什麼時候就能寫出 shi 一樣的代碼。
這是因爲編碼時的構思,沒有明確下來,構思不清晰,就相當於地基不穩。

接下來,我們以 TimeUtil爲例講解我的思考。


TimeUtils編碼時的考量

偶然的一次CodeReview,發現TimeUtils竟然不知道什麼時候,變亂了。

我知道 我該重構了。可是在重構之前,我仔細反思了自己對這個類的維護。說到底還是思考不充分導致。

沒有經過思考的代碼,是沒有靈氣的代碼。

大道至簡

我需要一個核心思想。於是,我開始琢磨。。

思考描述

及時的記錄自己當時的想法,請寫進CodeDesc中。

 * 在實際項目中,總可能會出現各種各樣的時間格式,花樣百出
 * 後端給N種格式,前端再轉換再顯示。
 * 講道理,是要統一後端給的格式:時間戳。
 * 這個後端給的時間,是要結合時區的。唯有時間戳不可破。
 * 爲了應對這種情況,前端必須適配。
 * 這是一個工具類,要具備通用性。
 * 這個類,應該提供各種類型轉換成long的方法
 * 提供,long轉換成各種格式的方法。(當然,時間格式,除了通用的都是模塊自己提供)
 * 做法:
 * 1. 子模塊,可以自己定義TimeConst。
 * 2. 子模塊先將後端的返回字段,轉換成long的時間戳
 * 2. 根據 子模塊自定義的格式,轉換成需要的格式。
 * <p>
 * 這個類包括:
 * 1、getTime從String、Date、Time獲取時間戳
 * 2、從long時間戳,轉化爲各種格式
 * 3、String轉Date
 * 4、String轉Calendar
 * 5、或者你會需要擴展些功能。我建議將公共的部分塞到public裏頭去,必須做差。

這份描述表達了我編寫這個代碼時的思考。
這段文字寫出來,這個類就算是實現了一半了;具體的編碼實現就是具體的思考。

思考永遠是最重要的

你的考量會給後面的同事帶來很多便捷,節約大量的時間。


工具類的初始化
    protected TimeUtils() {
        throw new UnsupportedOperationException("u can't instantiate me...");
    }
getTime從String、Date、Time獲取時間戳
    /**
     * Formatted time string to the milliseconds.
     *
     * @param time       The formatted time string.
     * @param timeFormat The format.
     * @return the milliseconds
     */
    public static long getTime(final String time, @NonNull final String timeFormat) {
        return getTime(time, new SimpleDateFormat(timeFormat));
    }

    /**
     * Formatted time string to the milliseconds.
     *
     * @param time   The formatted time string.
     * @param format The format.
     * @return the milliseconds
     */
    public static long getTime(final String time, @NonNull final DateFormat format) {
        try {
            return format.parse(time).getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return -1;
    }

    /**
     * 從Date轉成時間戳
     *
     * @param date
     * @return
     */
    public static long getTime(@NonNull final Date date) {
        return date.getTime();
    }

    /**
     * 從Date轉成時間戳
     *
     * @param date
     * @return
     */
    public static long getTime(@NonNull final Calendar date) {
        return getTime(date.getTime());
    }
    
    /**
     * 從Date轉成時間戳
     *
     * @param date
     * @return
     */
    public static long getTime(@NonNull final Calendar date) {
        return getTime(date.getTime());
    }
從long時間戳,轉化爲各種格式
/**
     * Milliseconds to the formatted time string.
     *
     * @param millis     The milliseconds.
     * @param timeFormat The format.
     * @return the formatted time string
     */
    public static String millis2String(final long millis, @NonNull final String timeFormat) {
        return millis2String(millis, new SimpleDateFormat(timeFormat));
    }

    /**
     * UTC time to format
     *
     * @param utcTime
     * @param format  yyyy-MM-dd HH:mm:ss
     * @return
     */
    public static String formatTo(String utcTime, String format) {
        if (utcTime == null) {
            return "";
        }
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSZ");
        Date result;
        try {
            result = df.parse(utcTime);
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
            return sdf.format(result);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return utcTime;
    }

    /**
     * Milliseconds to the formatted time string.
     *
     * @param millis The milliseconds.
     * @param format The format.
     * @return the formatted time string
     */
    public static String millis2String(final long millis, @NonNull final DateFormat format) {
        return format.format(new Date(millis));
    }
String轉Date

    /**
     * Formatted time string to the milliseconds.
     *
     * @param time   The formatted time string.
     * @param timeFormat The format.
     * @return the milliseconds
     */
    public static long string2Millis(final String time, @NonNull final String timeFormat) {
        return string2Millis(time, new SimpleDateFormat(timeFormat));
    }

    /**
     * Formatted time string to the milliseconds.
     *
     * @param time   The formatted time string.
     * @param format The format.
     * @return the milliseconds
     */
    public static long string2Millis(final String time, @NonNull final DateFormat format) {
        try {
            return format.parse(time).getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return -1;
    }
String轉Calendar

    /**
     * Formatted time string to the date.
     *
     * @param time       The formatted time string.
     * @param timeFormat The format.
     * @return the date
     */
    public static Date string2Date(final String time, @NonNull final String timeFormat) {
        return string2Date(time, new SimpleDateFormat(timeFormat));
    }

    /**
     * Formatted time string to the date.
     *
     * @param time   The formatted time string.
     * @param format The format.
     * @return the date
     */
    public static Date string2Date(final String time, @NonNull final DateFormat format) {
        try {
            return format.parse(time);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * Formatted time string to the date.
     *
     * @param time       The formatted time string.
     * @param timeFormat The format.
     * @return the date
     */
    public static Calendar string2Calendar(final String time, @NonNull final String timeFormat) {
        return string2Calendar(time, new SimpleDateFormat(timeFormat));
    }

    /**
     * Formatted time string to the date.
     *
     * @param time   The formatted time string.
     * @param format The format.
     * @return the date
     */
    public static Calendar string2Calendar(final String time, @NonNull final DateFormat format) {
        try {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(format.parse(time));
            return calendar;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
時間做差


    /**
     * 獲取合適型兩個時間差
     *
     * @param millis0   毫秒時間戳1
     * @param millis1   毫秒時間戳2
     * @param precision 精度
     *                  <p>precision = 0,返回null</p>
     *                  <p>precision = 1,返回天</p>
     *                  <p>precision = 2,返回天和小時</p>
     *                  <p>precision = 3,返回天、小時和分鐘</p>
     *                  <p>precision = 4,返回天、小時、分鐘和秒</p>
     *                  <p>precision &gt;= 5,返回天、小時、分鐘、秒和毫秒</p>
     * @return 合適型兩個時間差
     */
    public static int getFitTimeSpanV2(long millis0, long millis1, int precision) {
        return millis2FitTimeSpanV2(Math.abs(millis0 - millis1), precision);
    }

    @SuppressLint("DefaultLocale")
    public static int millis2FitTimeSpanV2(long millis, int precision) {
        if (millis <= 0) {
            return 0;
        }
        int[] unitLen = {86400000, 3600000, 60000, 1000, 1};
        long mode = 0;
        precision = Math.min(precision, 5);
        mode = millis / unitLen[precision];
        return (int) mode;
    }

小結

比起迅速開始編碼工作,思考構思更重要。
思考不充分,遲早會給你帶來返工。

程序員這份工作,總算很大的瓶頸。我時長想,這傢伙跟我差不多,卻爲什麼工資比我高辣麼多。

是思維決定了你的層次。凡事多思考。方有沉澱。

這就是好多人常說的。10年經驗,是10個1年經驗,還是1個10年經驗。
有成長方有沉澱。

沒有經過思考的代碼,是沒有靈氣的代碼。

大道至簡,Linux的開創者,當初也只是因爲一個想法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章