前言
在任何APP开发中,日期和时间是无处不在的,例如QQ、微信,每条信息都会显示发送时间,还有空间、朋友圈每一条数据也都有时间,比较细腻的APP还会显示“今天”、“昨天”、“某年某月某人”。
格式化日期时间
作为Android程序员,大家都知道代码里面直接获取到的时间都是Long型的字符串,不处理的话很难看懂。当然java给提供了API去处理这个Long型的时间,代码如下:
Date currentTime = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = formatter.format(currentTime);
解析字符串格式的日期时间
既然我们可以把Long型的时间转换成字符串形式的,那么我们就能够将字符串新式的日期转换成Long型的时间。想必大家也都知道具体代码,代码如下:
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Date dateformatter.parse("2017-07-10 12:23:00");
} catch (ParseException e) {
return null;
}
封装
日期时间的转换很明显就是一个工具性的东西,那么封装一个工具类势在必得,直接上代码:
public class TimeUtil {
/**
*一些时间格式
*/
public final static String FORMAT_TIME = "HH:mm";
public final static String FORMAT_DATE_TIME = "yyyy-MM-dd HH:mm";
public final static String FORMAT_DATE_TIME_SECOND = "yyyy-MM-dd HH:mm:ss";
public final static String FORMAT_MONTH_DAY_TIME = "MM-dd HH:mm";
public final static String FORMAT_DATE = "yyyy-MM-dd";
public static String getFormatToday(String dateFormat) {
Date currentTime = new Date();
SimpleDateFormat formatter = new SimpleDateFormat(dateFormat);
return formatter.format(currentTime);
}
public static Date stringToDate(String dateStr, String dateFormat) {
SimpleDateFormat formatter = new SimpleDateFormat(dateFormat);
try {
return formatter.parse(dateStr);
} catch (ParseException e) {
return null;
}
}
public static String dateToString(Date date, String dateFormat) {
SimpleDateFormat formatter = new SimpleDateFormat(dateFormat);
return formatter.format(date);
}
/**
*类似QQ/微信 聊天消息的时间
*/
public static String getChatTime(boolean hasYear, long timesamp) {
long clearTime = timesamp;
String result;
SimpleDateFormat sdf = new SimpleDateFormat("dd");
Date today = new Date(System.currentTimeMillis());
Date otherDay = new Date(clearTime);
int temp = Integer.parseInt(sdf.format(today))
- Integer.parseInt(sdf.format(otherDay));
switch (temp) {
case 0:
result = "今天 " + getHourAndMin(clearTime);
break;
case 1:
result = "昨天 " + getHourAndMin(clearTime);
break;
case 2:
result = "前天 " + getHourAndMin(clearTime);
break;
default:
result = getTime(hasYear,clearTime);
break;
}
return result;
}
private static String getTime(boolean hasYear, long time) {
String pattern=FORMAT_DATE_TIME;
if(!hasYear){
pattern = FORMAT_MONTH_DAY_TIME;
}
SimpleDateFormat format = new SimpleDateFormat(pattern);
return format.format(new Date(time));
}
private static String getHourAndMin(long time) {
SimpleDateFormat format = new SimpleDateFormat(FORMAT_TIME);
return format.format(new Date(time));
}
/**
* 获取当前日期是星期几
*
* @param date
* @return 当前日期是星期几
*/
public static String getWeekOfDate(Date date) {
String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
if (w < 0)
w = 0;
return weekDays[w];
}
}
代码比较简单,希望对大家有一定帮助,后续遇到新的需求再继续完善。当然,也希望小伙伴们给出建议。
补充
计算两个日期之间相差的 秒数/分钟数/天数
/**
* 判断某个日期与今天相差 x年x天
* 如果大于1年,显示x年x天 。否则显示 x天
* @param timeStamp
* @return
*/
public static String getOffsetYearAndDayByTimeStamp(long timeStamp) {
String result;
long currentTimeStamp = System.currentTimeMillis();
long targetTimestamp = timeStamp * 1000L;
int days = (int) ((currentTimeStamp - targetTimestamp) / ONE_YEAr);
if (days > 365) {
//大于1年
Calendar calendar1 = Calendar.getInstance();
calendar1.setTimeInMillis(currentTimeStamp);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTimeInMillis(targetTimestamp);
//先判断是否同年
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);
result = (y1 - y2) + "年" + (d1 - d2);
} else {
//不满一年,直接返回天数
result = String.valueOf(days);
}
return result;
}
/**
* 描述:计算两个日期所差的天数.
*
* @param date1 第一个时间的毫秒表示
* @param date2 第二个时间的毫秒表示
* @return int 所差的天数
*/
public static int getOffsetDay(long date1, long date2) {
Calendar calendar1 = Calendar.getInstance();
calendar1.setTimeInMillis(date1);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTimeInMillis(date2);
//先判断是否同年
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;
}
return day;
}
/**
* 描述:计算两个日期所差的小时数.
*
* @param date1 第一个时间的毫秒表示
* @param date2 第二个时间的毫秒表示
* @return int 所差的小时数
*/
public static int getOffsetHour(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 = getOffsetDay(date1, date2);
h = h1 - h2 + day * 24;
return h;
}
/**
* 描述:计算两个日期所差的分钟数.
*
* @param date1 第一个时间的毫秒表示
* @param date2 第二个时间的毫秒表示
* @return int 所差的分钟数
*/
public static int getOffsetMinutes(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 = getOffsetHour(date1, date2);
int m = 0;
m = m1 - m2 + h * 60;
return m;
}
获取某些特殊的日期,比如获取本周的周几的日期,获取本月的第一天,获取本月的最后一天
/**
* 描述:获取本周的某一天.
*
* @param format the format
* @param calendarField the calendar field
* @return String String类型日期时间
*/
private 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());
}
} catch (Exception e) {
e.printStackTrace();
}
return strDate;
}
/**
* 获取当前日期是星期几
*
* @param date
* @return 当前日期是星期几
*/
public static String getWeekOfDate(Date date) {
String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
if (w < 0)
w = 0;
return weekDays[w];
}
/**
* 描述:获取本月第一天.
*
* @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());
} catch (Exception e) {
e.printStackTrace();
}
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());
} catch (Exception e) {
e.printStackTrace();
}
return strDate;
}
希望这些总结对大家有所帮助,如果有不正确的地方也可以提出来一起进步。 如果觉的还不错的话,就给个赞哈!