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 + "毫秒";
}
}
}