文章講的很淺,道理大家都懂。寫出來,是爲了更好的貫徹它!
與君共勉
什麼是工具類?
這種 低級的問題還問的出來。
最近我發現 好多東西都是一看就懂。然而,自己不知道什麼時候就能寫出 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 >= 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的開創者,當初也只是因爲一個想法。