天天看點

這樣才是寫工具類TimeUtils編碼時的考量小結

這樣才是寫工具類TimeUtils編碼時的考量小結
文章講的很淺,道理大家都懂。寫出來,是為了更好的貫徹它!

與君共勉
           

什麼是工具類?

這樣才是寫工具類TimeUtils編碼時的考量小結

這種 低級的問題還問的出來。

最近我發現 好多東西都是一看就懂。然而,自己不知道什麼時候就能寫出 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的開創者,當初也隻是因為一個想法。