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());
}

此外,还有一些获取时间和处理比较简单的方法,这里就不做介绍了,看下源码就会用的,代码地址:

点击查看代码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容