package com.martin.simpledevelop.utils.date; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import android.annotation.SuppressLint; import com.martin.simpledevelop.utils.log.SaLogUtils; import com.martin.simpledevelop.utils.string.SaStrUtils; /** * @Description 日期管理工具类 * @File SaDateUtils.java * @Package com.martin.simpledevelop.utils.date * @Date 2015年6月25日下午11:37:36 * @Author Donghongyu 1358506549@qq.com * @Version v1.0.0 */ @SuppressLint("SimpleDateFormat") public class SaDateUtils { /** * Log 输出标签 */ public static String TAG = SaDateUtils.class.getName(); /** 时间日期格式化到年月日时分秒. */ public static final String dateFormatYMDHMS = "yyyy-MM-dd HH:mm:ss"; /** 时间日期格式化到年月日. */ public static final String dateFormatYMD = "yyyy-MM-dd"; /** 时间日期格式化到年月. */ public static final String dateFormatYM = "yyyy-MM"; /** 时间日期格式化到年月日时分. */ public static final String dateFormatYMDHM = "yyyy-MM-dd HH:mm"; /** 时间日期格式化到月日. */ public static final String dateFormatMD = "MM/dd"; /** 时分秒. */ public static final String dateFormatHMS = "HH:mm:ss"; /** 时分. */ public static final String dateFormatHM = "HH:mm"; /** 上午. */ public static final String AM = "AM"; /** 下午. */ public static final String PM = "PM"; /** * 获取当前时间戳 * * @return 时间戳 */ public static long getCurrentTime() { Calendar calendar = Calendar.getInstance(); long timeInMillis = calendar.getTimeInMillis(); SaLogUtils.d(TAG, "获取当前时间戳-->" + timeInMillis); return timeInMillis; } /** * 格式化12小时制<br> * 格式:yyyy-MM-dd hh-MM-ss * * @param time * 时间 * @return */ public static String format12Time(long time) { String format12Time = format(time, "yyyy-MM-dd hh:MM:ss"); SaLogUtils.d(TAG, "格式化12小时制-yyyy-MM-dd hh-MM-ss->" + format12Time); return format12Time; } /** * 格式化24小时制<br> * 格式:yyyy-MM-dd HH-MM-ss * * @param time * 时间 * @return */ public static String format24Time(long time) { String format24Time = format(time, "yyyy-MM-dd HH:MM:ss"); SaLogUtils.d(TAG, "格式化24小时制-yyyy-MM-dd hh-MM-ss->" + format24Time); return format24Time; } /** * 格式化时间,自定义标签 * * @param time * 时间 * @param pattern * 格式化时间用的标签 * @return */ public static String format(long time, String pattern) { SimpleDateFormat sdf = new SimpleDateFormat(pattern); String formatDate = sdf.format(new Date(time)); SaLogUtils.d(TAG, "格式化时间,自定义标签-->" + formatDate); return formatDate; } /** * 获取当前天 * * @return 天 */ @SuppressWarnings("static-access") public static int getCurrentDay() { Calendar calendar = Calendar.getInstance(); int currentDay = calendar.get(calendar.DAY_OF_MONTH); SaLogUtils.d(TAG, "获取当前天-单位为天->" + currentDay); return currentDay; } /** * 获取当前月 * * @return 月 */ @SuppressWarnings("static-access") public static int getCurrentMonth() { Calendar calendar = Calendar.getInstance(); int currentMonth = calendar.get(calendar.MONTH); SaLogUtils.d(TAG, "获取当前天-单位为月->" + currentMonth); return currentMonth; } /** * 获取当前年 * * @return 年 */ @SuppressWarnings("static-access") public static int getCurrentYear() { Calendar calendar = Calendar.getInstance(); int currentYear = calendar.get(calendar.YEAR); SaLogUtils.d(TAG, "获取当前天-单位为年->" + currentYear); return currentYear; } /** * 描述:String类型的日期时间转化为Date类型. * * @param strDate * String形式的日期时间 * @param format * 格式化字符串,如:"yyyy-MM-dd HH:mm:ss" * @return Date Date类型日期时间 */ @SuppressLint("SimpleDateFormat") public static Date getDateByFormat(String strDate, String format) { SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); Date date = null; try { date = mSimpleDateFormat.parse(strDate); SaLogUtils.d(TAG, "String类型的日期时间转化为Date类型->" + date); } catch (ParseException e) { e.printStackTrace(); SaLogUtils.e(TAG, "String类型的日期时间转化为Date类型异常-->" + e.getMessage()); } return date; } /** * 描述:获取偏移之后的Date. * * @param date * 日期时间 * @param calendarField * Calendar属性,对应offset的值, * 如(Calendar.DATE,表示+offset天,Calendar.HOUR_OF_DAY,表示+offset小时) * @param offset * 偏移(值大于0,表示+,值小于0,表示-) * @return Date 偏移之后的日期时间 */ public static Date getDateByOffset(Date date, int calendarField, int offset) { Calendar c = new GregorianCalendar(); try { c.setTime(date); c.add(calendarField, offset); SaLogUtils.d(TAG, "获取偏移之后的Date->" + c.getTime()); } catch (Exception e) { e.printStackTrace(); SaLogUtils.e(TAG, "获取偏移之后的Date异常-->" + e.getMessage()); } return c.getTime(); } /** * 描述:获取指定日期时间的字符串(可偏移). * * @param strDate * String形式的日期时间 * @param format * 格式化字符串,如:"yyyy-MM-dd HH:mm:ss" 要返回的格式 * @param calendarField * Calendar属性,对应offset的值,要偏移的字段,就是年,月,日,时,分,秒 * 如(Calendar.DATE,表示+offset天,Calendar.HOUR_OF_DAY,表示+offset小时) * @param offset * 偏移(值大于0,表示+,值小于0,表示-) * @return String String类型的日期时间 */ public static String getStringByOffset(String strDate, String format, int calendarField, int offset) { String mDateTime = null; try { Calendar c = new GregorianCalendar(); SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); c.setTime(mSimpleDateFormat.parse(strDate)); c.add(calendarField, offset); mDateTime = mSimpleDateFormat.format(c.getTime()); SaLogUtils.d(TAG, "获取指定日期时间的字符串(可偏移)-->" + mDateTime); } catch (ParseException e) { e.printStackTrace(); SaLogUtils.e(TAG, "获取指定日期时间的字符串(可偏移)-->" + e.getMessage()); } return mDateTime; } /** * 描述:Date类型转化为String类型(可偏移). * * @param date * the date * @param format * the format * @param calendarField * the calendar field * @param offset * the offset * @return String String类型日期时间 */ public static String getStringByOffset(Date date, String format, int calendarField, int offset) { String strDate = null; try { Calendar c = new GregorianCalendar(); SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); c.setTime(date); c.add(calendarField, offset); strDate = mSimpleDateFormat.format(c.getTime()); SaLogUtils.d(TAG, "Date类型转化为String类型(可偏移)-->" + strDate); } catch (Exception e) { e.printStackTrace(); SaLogUtils.e(TAG, "Date类型转化为String类型(可偏移)异常-->" + e.getMessage()); } return strDate; } /** * 描述:Date类型转化为String类型. * * @param date * the date * @param format * the format 想要的日期格式 * @return String String类型日期时间 */ public static String getStringByFormat(Date date, String format) { SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); String strDate = null; try { strDate = mSimpleDateFormat.format(date); SaLogUtils.d(TAG, "Date类型转化为String类型.-->" + strDate); } catch (Exception e) { e.printStackTrace(); SaLogUtils.e(TAG, "Date类型转化为String类型.异常-->" + e.getMessage()); } return strDate; } /** * 描述:获取指定日期时间的字符串,用于导出想要的格式. * * @param strDate * String形式的日期时间,必须为yyyy-MM-dd HH:mm:ss格式 * @param format * 输出格式化字符串,如:"yyyy-MM-dd HH:mm:ss" * @return String 转换后的String类型的日期时间 */ public static String getStringByFormat(String strDate, String format) { String mDateTime = null; try { Calendar c = new GregorianCalendar(); SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat( dateFormatYMDHMS); c.setTime(mSimpleDateFormat.parse(strDate)); SimpleDateFormat mSimpleDateFormat2 = new SimpleDateFormat(format); mDateTime = mSimpleDateFormat2.format(c.getTime()); SaLogUtils.d(TAG, "获取指定日期时间的字符串,用于导出想要的格式-->" + mDateTime); } catch (Exception e) { e.printStackTrace(); SaLogUtils.e(TAG, "获取指定日期时间的字符串,用于导出想要的格式.异常-->" + e.getMessage()); } return mDateTime; } /** * 描述:获取milliseconds表示的日期时间的字符串. * * @param milliseconds * the milliseconds * @param format * 格式化字符串,如:"yyyy-MM-dd HH:mm:ss" * @return String 日期时间字符串 */ public static String getStringByFormat(long milliseconds, String format) { String thisDateTime = null; try { SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); thisDateTime = mSimpleDateFormat.format(milliseconds); SaLogUtils.d(TAG, "获取milliseconds表示的日期时间的字符串-->" + thisDateTime); } catch (Exception e) { e.printStackTrace(); SaLogUtils.e(TAG, "获取milliseconds表示的日期时间的字符串.异常-->" + e.getMessage()); } return thisDateTime; } /** * 描述:获取表示当前日期时间的字符串. * * @param format * 格式化字符串,如:"yyyy-MM-dd HH:mm:ss" * @return String String类型的当前日期时间 */ public static String getCurrentDate(String format) { SaLogUtils.d(SaDateUtils.class, "getCurrentDate:" + format); String curDateTime = null; try { SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); Calendar c = new GregorianCalendar(); curDateTime = mSimpleDateFormat.format(c.getTime()); SaLogUtils.d(TAG, "获取表示当前日期时间的字符串-->" + curDateTime); } catch (Exception e) { e.printStackTrace(); SaLogUtils.e(TAG, "获取表示当前日期时间的字符串..异常-->" + e.getMessage()); } return curDateTime; } /** * 描述:获取表示当前日期时间的字符串(可偏移). * * @param format * 格式化字符串,如:"yyyy-MM-dd HH:mm:ss" * @param calendarField * Calendar属性,对应offset的值, * 如(Calendar.DATE,表示+offset天,Calendar.HOUR_OF_DAY,表示+offset小时) * @param offset * 偏移(值大于0,表示+,值小于0,表示-) * @return String String类型的日期时间 */ public static String getCurrentDateByOffset(String format, int calendarField, int offset) { String mDateTime = null; try { SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); Calendar c = new GregorianCalendar(); c.add(calendarField, offset); mDateTime = mSimpleDateFormat.format(c.getTime()); SaLogUtils.d(TAG, "获取表示当前日期时间的字符串(可偏移).-->" + mDateTime); } catch (Exception e) { e.printStackTrace(); SaLogUtils.e(TAG, "获取表示当前日期时间的字符串(可偏移)..异常-->" + e.getMessage()); } return mDateTime; } /** * 描述:计算两个日期所差的天数. * * @param milliseconds1 * the milliseconds1 * @param milliseconds2 * the milliseconds2 * @return int 所差的天数 */ public static int getOffectDay(long milliseconds1, long milliseconds2) { Calendar calendar1 = Calendar.getInstance(); calendar1.setTimeInMillis(milliseconds1); Calendar calendar2 = Calendar.getInstance(); calendar2.setTimeInMillis(milliseconds2); // 先判断是否同年 int y1 = calendar1.get(Calendar.YEAR); int y2 = calendar2.get(Calendar.YEAR); int d1 = calendar1.get(Calendar.DAY_OF_YEAR); int d2 = calendar2.get(Calendar.DAY_OF_YEAR); int maxDays = 0; int day = 0; if (y1 - y2 > 0) { maxDays = calendar2.getActualMaximum(Calendar.DAY_OF_YEAR); day = d1 - d2 + maxDays; } else if (y1 - y2 < 0) { maxDays = calendar1.getActualMaximum(Calendar.DAY_OF_YEAR); day = d1 - d2 - maxDays; } else { day = d1 - d2; } SaLogUtils.d(TAG, "计算两个日期所差的天数-->" + day); return day; } /** * 描述:计算两个日期所差的小时数. * * @param date1 * 第一个时间的毫秒表示 * @param date2 * 第二个时间的毫秒表示 * @return int 所差的小时数 */ public static int getOffectHour(long date1, long date2) { Calendar calendar1 = Calendar.getInstance(); calendar1.setTimeInMillis(date1); Calendar calendar2 = Calendar.getInstance(); calendar2.setTimeInMillis(date2); int h1 = calendar1.get(Calendar.HOUR_OF_DAY); int h2 = calendar2.get(Calendar.HOUR_OF_DAY); int h = 0; int day = getOffectDay(date1, date2); h = h1 - h2 + day * 24; SaLogUtils.d(TAG, "计算两个日期所差的小时数-->" + h); return h; } /** * 描述:计算两个日期所差的分钟数. * * @param date1 * 第一个时间的毫秒表示 * @param date2 * 第二个时间的毫秒表示 * @return int 所差的分钟数 */ public static int getOffectMinutes(long date1, long date2) { Calendar calendar1 = Calendar.getInstance(); calendar1.setTimeInMillis(date1); Calendar calendar2 = Calendar.getInstance(); calendar2.setTimeInMillis(date2); int m1 = calendar1.get(Calendar.MINUTE); int m2 = calendar2.get(Calendar.MINUTE); int h = getOffectHour(date1, date2); int m = 0; m = m1 - m2 + h * 60; SaLogUtils.d(TAG, "计算两个日期所差的分钟数.-->" + m); return m; } /** * 描述:获取本周一.日期 * * @param format * the format * @return String String类型日期时间 */ public static String getFirstDayOfWeek(String format) { String firstDayOfWeek = getDayOfWeek(format, Calendar.MONDAY); SaLogUtils.d(TAG, "获取本周一-日期->" + firstDayOfWeek); return firstDayOfWeek; } /** * 描述:获取本周日.日期 * * @param format * the format * @return String String类型日期时间 */ public static String getLastDayOfWeek(String format) { String lastDayOfWeek = getDayOfWeek(format, Calendar.SUNDAY); SaLogUtils.d(TAG, "获取本周日-日期->" + lastDayOfWeek); return lastDayOfWeek; } /** * 描述:获取本周的某一天. * * @param format * the format * @param calendarField * the calendar field * @return String String类型日期时间 */ public static String getDayOfWeek(String format, int calendarField) { String strDate = null; try { Calendar c = new GregorianCalendar(); SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); int week = c.get(Calendar.DAY_OF_WEEK); if (week == calendarField) { strDate = mSimpleDateFormat.format(c.getTime()); } else { int offectDay = calendarField - week; if (calendarField == Calendar.SUNDAY) { offectDay = 7 - Math.abs(offectDay); } c.add(Calendar.DATE, offectDay); strDate = mSimpleDateFormat.format(c.getTime()); SaLogUtils.d(TAG, "获取本周的某一天.-日期->" + strDate); } } catch (Exception e) { e.printStackTrace(); SaLogUtils.e(TAG, "获取本周的某一天..异常-->" + e.getMessage()); } return strDate; } /** * 描述:获取本月第一天. * * @param format * the format * @return String String类型日期时间 */ public static String getFirstDayOfMonth(String format) { String strDate = null; try { Calendar c = new GregorianCalendar(); SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); // 当前月的第一天 c.set(GregorianCalendar.DAY_OF_MONTH, 1); strDate = mSimpleDateFormat.format(c.getTime()); SaLogUtils.d(TAG, "获取本月第一天..-日期->" + strDate); } catch (Exception e) { e.printStackTrace(); SaLogUtils.e(TAG, "获取本月第一天..异常-->" + e.getMessage()); } return strDate; } /** * 描述:获取本月最后一天. * * @param format * the format * @return String String类型日期时间 */ public static String getLastDayOfMonth(String format) { String strDate = null; try { Calendar c = new GregorianCalendar(); SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); // 当前月的最后一天 c.set(Calendar.DATE, 1); c.roll(Calendar.DATE, -1); strDate = mSimpleDateFormat.format(c.getTime()); SaLogUtils.d(TAG, "获取本月最后一天...-日期->" + strDate); } catch (Exception e) { e.printStackTrace(); SaLogUtils.e(TAG, "获取本月最后一天...异常-->" + e.getMessage()); } return strDate; } /** * 描述:获取表示当前日期的0点时间毫秒数. * * @return the first time of day */ public static long getFirstTimeOfDay() { Date date = null; try { String currentDate = getCurrentDate(dateFormatYMD); date = getDateByFormat(currentDate + " 00:00:00", dateFormatYMDHMS); SaLogUtils.d(TAG, "获取表示当前日期的0点时间毫秒数....-日期->" + date.getTime()); return date.getTime(); } catch (Exception e) { e.printStackTrace(); SaLogUtils.e(TAG, "获取表示当前日期的0点时间毫秒数....异常-->" + e.getMessage()); } return -1; } /** * 描述:获取表示当前日期24点时间毫秒数. * * @return the last time of day */ public static long getLastTimeOfDay() { Date date = null; try { String currentDate = getCurrentDate(dateFormatYMD); date = getDateByFormat(currentDate + " 24:00:00", dateFormatYMDHMS); SaLogUtils.d(TAG, "获取表示当前日期24点时间毫秒数...-日期->" + date.getTime()); return date.getTime(); } catch (Exception e) { e.printStackTrace(); SaLogUtils.e(TAG, "获取表示当前日期24点时间毫秒数....异常-->" + e.getMessage()); } return -1; } /** * 描述:判断是否是闰年() * <p> * (year能被4整除 并且 不能被100整除) 或者 year能被400整除,则该年为闰年. * * @param year * 年代(如2012) * @return boolean 是否为闰年 */ public static boolean isLeapYear(int year) { if ((year % 4 == 0 && year % 400 != 0) || year % 400 == 0) { return true; } else { return false; } } /** * 描述:根据时间返回格式化后的时间的描述. 小于1小时显示多少分钟前 大于1小时显示今天+实际日期,大于今天全部显示实际时间 * * @param strDate * the str date * @param outFormat * the out format * @return the string */ public static String formatDateStr2Desc(String strDate, String outFormat) { DateFormat df = new SimpleDateFormat(dateFormatYMDHMS); Calendar c1 = Calendar.getInstance(); Calendar c2 = Calendar.getInstance(); try { c2.setTime(df.parse(strDate)); c1.setTime(new Date()); int d = getOffectDay(c1.getTimeInMillis(), c2.getTimeInMillis()); if (d == 0) { int h = getOffectHour(c1.getTimeInMillis(), c2.getTimeInMillis()); if (h > 0) { return "今天" + getStringByFormat(strDate, dateFormatHM); // return h + "小时前"; } else if (h < 0) { // return Math.abs(h) + "小时后"; } else if (h == 0) { int m = getOffectMinutes(c1.getTimeInMillis(), c2.getTimeInMillis()); if (m > 0) { return m + "分钟前"; } else if (m < 0) { // return Math.abs(m) + "分钟后"; } else { return "刚刚"; } } } else if (d > 0) { if (d == 1) { // return "昨天"+getStringByFormat(strDate,outFormat); } else if (d == 2) { // return "前天"+getStringByFormat(strDate,outFormat); } } else if (d < 0) { if (d == -1) { // return "明天"+getStringByFormat(strDate,outFormat); } else if (d == -2) { // return "后天"+getStringByFormat(strDate,outFormat); } else { // return Math.abs(d) + // "天后"+getStringByFormat(strDate,outFormat); } } String out = getStringByFormat(strDate, outFormat); if (!SaStrUtils.isEmpty(out)) { return out; } } catch (Exception e) { e.printStackTrace(); SaLogUtils.e(TAG, "根据时间返回格式化后的时间的描述...异常-->" + e.getMessage()); } return strDate; } /** * 取指定日期为星期几. * * @param strDate * 指定日期 * @param inFormat * 指定日期格式 * @return String 星期几 */ public static String getWeekNumber(String strDate, String inFormat) { String week = "星期日"; Calendar calendar = new GregorianCalendar(); DateFormat df = new SimpleDateFormat(inFormat); try { calendar.setTime(df.parse(strDate)); } catch (Exception e) { return "错误"; } int intTemp = calendar.get(Calendar.DAY_OF_WEEK) - 1; switch (intTemp) { case 0: week = "星期日"; break; case 1: week = "星期一"; break; case 2: week = "星期二"; break; case 3: week = "星期三"; break; case 4: week = "星期四"; break; case 5: week = "星期五"; break; case 6: week = "星期六"; break; } return week; } /** * 根据给定的日期判断是否为上下午. * * @param strDate * the str date * @param format * the format * @return the time quantum */ @SuppressWarnings("deprecation") public static String getTimeQuantum(String strDate, String format) { Date mDate = getDateByFormat(strDate, format); int hour = mDate.getHours(); if (hour >= 12) return "PM"; else return "AM"; } /** * 根据给定的毫秒数算得时间的描述. * * @param milliseconds * the milliseconds * @return the time description */ public static String getTimeDescription(long milliseconds) { if (milliseconds > 1000) { // 大于一分 if (milliseconds / 1000 / 60 > 1) { long minute = milliseconds / 1000 / 60; long second = milliseconds / 1000 % 60; return minute + "分" + second + "秒"; } else { // 显示秒 return milliseconds / 1000 + "秒"; } } else { return milliseconds + "毫秒"; } } }