TimeUtils,有關時間處理的工具類

介紹

一些關於時間處理的方法,在日常開發中時常用到,已經封裝好,末尾有源碼下載。

獲取剩餘天數

輸入結束的時間,格式yyyy-MM-dd,得到剩餘的天數,如當前時間是2017-08-08,輸入結束的時間爲2017-08-12,則得到的結果是4,即到達期限時間剩餘4天。

/**
 * 得到剩餘天數
 *
 * @param endTime 結束時間
 * @return
 */
public static int getDayLast(String endTime) {
    try {
        long nowtime = new Date().getTime();
        long lastTime = new SimpleDateFormat("yyyy-MM-dd").parse(endTime).getTime();

        long distance = lastTime - nowtime;
        if (distance <= 0) {
            //如果是小於或等於0,則爲0
            return 0;
        }

        double rate = distance / (1.0f * 24 * 3600 * 1000);
        int day = (int) (rate + 0.5f);
        return day;
    } catch (ParseException e) {
        e.printStackTrace();
        return -1;
    }
}

獲取短時間一(新聞類,博客類App,評論功能常用)

比如從服務器獲取的數據中,有文章的發表時間,long類型的時間,通過調用此方法:

  • 如果是距離當前時間是10分鐘內,則顯示”剛剛”;
  • 如果小於一小時則顯示”x分鐘前”;
  • 如果大於1小時小於24小時,則顯示”x小時前”;
  • 如果大於24小時,則顯示”昨天xx時xx分”;
  • 如果大於兩天則顯示”yyyy-MM-dd”;

代碼:

public static final long ONE_MINUTE_MILLIONS = 60 * 1000;
public static final long ONE_HOUR_MILLIONS = 60 * ONE_MINUTE_MILLIONS;

/**
 * 獲取短時間格式
 *
 * @return
 */
public static String getShortTime(long millis) {
    Date date = new Date(millis);
    Date curDate = new Date();

    String str = "";
    long durTime = curDate.getTime() - date.getTime();

    int dayStatus = calculateDayStatus(date, new Date());

    if (durTime <= 10 * ONE_MINUTE_MILLIONS) {
        str = "剛剛";
    } else if (durTime < ONE_HOUR_MILLIONS) {
        str = durTime / ONE_MINUTE_MILLIONS + "分鐘前";
    } else if (dayStatus == 0) {
        str = durTime / ONE_HOUR_MILLIONS + "小時前";
    } else if (dayStatus == -1) {
        str = "昨天" + DateFormat.format("HH:mm", date);
    } else if (isSameYear(date, curDate) && dayStatus < -1) {
        str = DateFormat.format("MM-dd", date).toString();
    } else {
        str = DateFormat.format("yyyy-MM", date).toString();
    }
    return str;
}

/**
 * 判斷是否是同一年
 * @param targetTime
 * @param compareTime
 * @return
 */
public static boolean isSameYear(Date targetTime, Date compareTime) {
    Calendar tarCalendar = Calendar.getInstance();
    tarCalendar.setTime(targetTime);
    int tarYear = tarCalendar.get(Calendar.YEAR);

    Calendar compareCalendar = Calendar.getInstance();
    compareCalendar.setTime(compareTime);
    int comYear = compareCalendar.get(Calendar.YEAR);

    return tarYear == comYear;
}

/**
 * 判斷是否處於今天還是昨天,0表示今天,-1表示昨天,小於-1則是昨天以前
 * @param targetTime
 * @param compareTime
 * @return
 */
public static int calculateDayStatus(Date targetTime, Date compareTime) {
    Calendar tarCalendar = Calendar.getInstance();
    tarCalendar.setTime(targetTime);
    int tarDayOfYear = tarCalendar.get(Calendar.DAY_OF_YEAR);

    Calendar compareCalendar = Calendar.getInstance();
    compareCalendar.setTime(compareTime);
    int comDayOfYear = compareCalendar.get(Calendar.DAY_OF_YEAR);

    return tarDayOfYear - comDayOfYear;
}

獲取短時間二(IM類App常用)

第一個參數爲long類型的時間,第二個參數爲boolean類型的值:

若爲true,則是用於聊天界面顯示的時間格式,顯示比較具體的時間

  • 如果是今天則顯示”時間段 時:分”,如:”凌晨01:08”,”上午 09:58”,”下午15:30”,”晚上 19:05”等;
  • 如果是昨天則顯示”昨天 時:分”的格式,如:”昨天 09:58”;
  • 如果是同在一個星期或前天之前的時間,則顯示”星期x 時:分”,如:”星期一 09:58”

若爲false,則是用於會話記錄界面(相當於微信的”微信”模塊)顯示的時間格式,不需要展示很具體的時間

  • 如果是今天,則直接顯示”時:分”,如”09:58”;
  • 如果不是今天,不需要展示時和分,直接顯示昨天、前天、星期幾

代碼:

 /**
 * @param milliseconds 時間值
 * @param isDetail 是否需要顯示具體時間段 + 時分和星期 + 時分
 * @return
 */
public static String getTimeShowString(long milliseconds,boolean isDetail) {
    String dataString = "";
    String timeStringBy24 = "";

    Date currentTime = new Date(milliseconds);
    Date today = new Date();
    Calendar todayStart = Calendar.getInstance();
    todayStart.set(Calendar.HOUR_OF_DAY, 0);
    todayStart.set(Calendar.MINUTE, 0);
    todayStart.set(Calendar.SECOND, 0);
    todayStart.set(Calendar.MILLISECOND, 0);
    Date todaybegin = todayStart.getTime();
    Date yesterdaybegin = new Date(todaybegin.getTime() - 3600 * 24 * 1000);
    Date preyesterday = new Date(
            yesterdaybegin.getTime() - 3600 * 24 * 1000);

    if (!currentTime.before(todaybegin)) {
        dataString = "今天";
    } else if (!currentTime.before(yesterdaybegin)) {
        dataString = "昨天";
    } else if (!currentTime.before(preyesterday)) {
        dataString = "前天";
    } else if (isSameWeekDates(currentTime, today)) {
        dataString = getWeekOfDate(currentTime);
    } else {
        SimpleDateFormat dateformatter = new SimpleDateFormat("yyyy-MM-dd",
                Locale.getDefault());
        dataString = dateformatter.format(currentTime);
    }

    SimpleDateFormat timeformatter24 = new SimpleDateFormat("HH:mm",
            Locale.getDefault());
    timeStringBy24 = timeformatter24.format(currentTime);

    if (isDetail) {//顯示具體的時間
        //在聊天界面顯示時間,如果是今天則顯示當前時間段加上時和分  如上午 9:58
        if (!currentTime.before(todaybegin)) {//如果是今天
            return getTodayTimeBucket(currentTime);//根據時間段分爲凌晨 上午 下午等
        } else {
            //如果是昨天 則是 昨天 9:58 如果是同在一個星期,前天之前的時間則顯示 星期一 9:58
            return dataString + " " + timeStringBy24;
        }
    }else{
        //在會話記錄界面不需要展示很具體的時間
        if (!currentTime.before(todaybegin)) {//如果是今天
            return timeStringBy24;//直接返回時和分 如 9:58
        }else{
            return dataString;//如果不是今天,不需要展示時和分 如 昨天 前天 星期一
        }
    }
}


/**
 * 判斷兩個日期是否在同一周
 *
 * @param date1
 * @param date2
 * @return
 */
public static boolean isSameWeekDates(Date date1, Date date2) {
    Calendar cal1 = Calendar.getInstance();
    Calendar cal2 = Calendar.getInstance();
    cal1.setTime(date1);
    cal2.setTime(date2);
    int subYear = cal1.get(Calendar.YEAR) - cal2.get(Calendar.YEAR);
    if (0 == subYear) {
        if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2
                .get(Calendar.WEEK_OF_YEAR))
            return true;
    } else if (1 == subYear && 11 == cal2.get(Calendar.MONTH)) {
        // 如果12月的最後一週橫跨來年第一週的話則最後一週即算做來年的第一週
        if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2
                .get(Calendar.WEEK_OF_YEAR))
            return true;
    } else if (-1 == subYear && 11 == cal1.get(Calendar.MONTH)) {
        if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2
                .get(Calendar.WEEK_OF_YEAR))
            return true;
    }
    return false;
}

/**
 * 根據日期獲得星期
 *
 * @param date
 * @return
 */
public static String getWeekOfDate(Date date) {
    String[] weekDaysName = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五",
            "星期六" };
    // String[] weekDaysCode = { "0", "1", "2", "3", "4", "5", "6" };
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    int intWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
    return weekDaysName[intWeek];
}

/**
 * 根據不同時間段,顯示不同時間
 *
 * @param date
 * @return
 */
public static String getTodayTimeBucket(Date date) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    SimpleDateFormat timeformatter0to11 = new SimpleDateFormat("KK:mm",
            Locale.getDefault());
    SimpleDateFormat timeformatter1to12 = new SimpleDateFormat("hh:mm",
            Locale.getDefault());
    int hour = calendar.get(Calendar.HOUR_OF_DAY);
    if (hour >= 0 && hour < 5) {
        return "凌晨 " + timeformatter0to11.format(date);
    } else if (hour >= 5 && hour < 12) {
        return "上午 " + timeformatter0to11.format(date);
    } else if (hour >= 12 && hour < 18) {
        return "下午 " + timeformatter1to12.format(date);
    } else if (hour >= 18 && hour < 24) {
        return "晚上 " + timeformatter1to12.format(date);
    }
    return "";
}

視頻時長轉換

如獲取到視頻的duration(時長)爲118秒,則轉換成”00:00”的格式則是”01:58”。

/**
 * 將秒數轉換成00:00的字符串,如 118秒 -> 01:58
 * @param time
 * @return
 */
public static String secToTime(int time) {
    String timeStr = null;
    int hour = 0;
    int minute = 0;
    int second = 0;
    if (time <= 0)
        return "00:00";
    else {
        minute = time / 60;
        if (minute < 60) {
            second = time % 60;
            timeStr = unitFormat(minute) + ":" + unitFormat(second);
        } else {
            hour = minute / 60;
            if (hour > 99)
                return "99:59:59";
            minute = minute % 60;
            second = time - hour * 3600 - minute * 60;
            timeStr = unitFormat(hour) + ":" + unitFormat(minute) + ":"
                    + unitFormat(second);
        }
    }
    return timeStr;
}

public static String unitFormat(int i) {
    String retStr = null;
    if (i >= 0 && i < 10)
        retStr = "0" + Integer.toString(i);
    else
        retStr = "" + i;
    return retStr;
}

獲取當前月1號

如現在是2017-08-08,調用此方法將獲取到這個月的1號,即”2017-08-01”。

 /**
 * 獲取當前月1號  返回格式yyyy-MM-dd (eg: 2007-06-01)
 *
 * @return
 */
public static String getMonthBegin() {
    String yearMonth = new SimpleDateFormat(
            "yyyy-MM").format(new Date());
    return yearMonth + "-01";
}

輸入時間和當前時間對比

輸入想要對比的時間,”yyyy-MM-dd HH:mm:ss”格式,將有三種結果:

  • 小於0,輸入的時間比當前時間小,即輸入的時間在當前時間之前;
  • 等於0,輸入的時間和當前時間一致(時間相同);
  • 大於0,輸入的時間比當前時間大,即輸入的時間在當前時間之後;

代碼:

public static SimpleDateFormat sdf = new SimpleDateFormat(
        "yyyy-MM-dd HH:mm:ss");

/**
 * 與當前時間對比 
 * @param time
 * @return
 */
public static long compareTime(String time) {
    long timeLong = 0;
    long curTimeLong = 0;

    try {
        timeLong = sdf.parse(time).getTime();
        curTimeLong = sdf.parse(getCurrentTimeString())
                .getTime();
    } catch (ParseException e) {
        e.printStackTrace();
    }

    return curTimeLong - timeLong;// 當前時間減去傳入的時間
}

/**
 * 返回yyyy-MM-dd HH:mm:ss類型的時間字符串
 */
public static String getCurrentTimeString() {
    return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")//
            .format(new Date());
}

此外,還有一些獲取時間和處理比較簡單的方法,這裏就不做介紹了,看下源碼就會用的,代碼地址:

點擊查看代碼

發佈了51 篇原創文章 · 獲贊 144 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章