package xyz.yhsj.yhutils.string;
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 xyz.yhsj.yhutils.logutils.LogUtils;
public class DateUtils {
private final static long minute = 60 * 1000;// 1分钟
private final static long hour = 60 * minute;// 1小时
private final static long day = 24 * hour;// 1天
private final static long month = 31 * day;// 月
private final static long year = 12 * month;// 年
/**
* 日期格式:yyyy-MM-dd HH:mm:ss
**/
public static final String DF_YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
/**
* 日期格式:yyyy-MM-dd hh:mm:ss
**/
public static final String DF_YYYY_MM_DD_h_MM_SS = "yyyy-MM-dd hh:mm:ss";
/**
* 日期格式:yyyy-MM-dd HH:mm
**/
public static final String DF_YYYY_MM_DD_HH_MM = "yyyy-MM-dd HH:mm";
/**
* 日期格式:yyyy-MM-dd
**/
public static final String DF_YYYY_MM_DD = "yyyy-MM-dd";
/**
* 日期格式:HH:mm:ss
**/
public static final String DF_HH_MM_SS = "HH:mm:ss";
/**
* 日期格式:HH:mm
**/
public static final String DF_HH_MM = "HH:mm";
/**
* 将日期格式化成友好的字符串:几分钟前、几小时前、几天前、几月前、几年前、刚刚
*
* @param date
* @return
*/
public static String formatFriendly(Date date) {
Calendar now = Calendar.getInstance();
now.setTime(new Date());
int nowYear = now.get(Calendar.YEAR);
int nowMonth = now.get(Calendar.MONTH);
int nowWeek = now.get(Calendar.WEEK_OF_MONTH);
int nowDay = now.get(Calendar.DAY_OF_WEEK);
int nowHour = now.get(Calendar.HOUR_OF_DAY);
int nowMinute = now.get(Calendar.MINUTE);
Calendar ca = Calendar.getInstance();
if (date != null)
ca.setTime(date);
else
ca.setTime(new Date());
int year = ca.get(Calendar.YEAR);
int month = ca.get(Calendar.MONTH);
int week = ca.get(Calendar.WEEK_OF_MONTH);
int day = ca.get(Calendar.DAY_OF_WEEK);
int hour = ca.get(Calendar.HOUR_OF_DAY);
int minute = ca.get(Calendar.MINUTE);
if (year != nowYear) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//不同年份
return sdf.format(date);
} else {
if (month != nowMonth) {
//不同月份
SimpleDateFormat sdf = new SimpleDateFormat("M月dd日");
return sdf.format(date);
} else {
if (week != nowWeek) {
//不同周
SimpleDateFormat sdf = new SimpleDateFormat("M月dd日");
return sdf.format(date);
} else if (day != nowDay) {
if (day + 1 == nowDay) {
return "昨天" + format(date, "HH:mm");
}
if (day + 2 == nowDay) {
return "前天" + format(date, "HH:mm");
}
//不同天
SimpleDateFormat sdf = new SimpleDateFormat("M月dd日");
return sdf.format(date);
} else {
//同一天
int hourGap = nowHour - hour;
if (hourGap == 0)//1小时内
{
if (nowMinute - minute < 1) {
return "刚刚";
} else {
return (nowMinute - minute) + "分钟前";
}
} else if (hourGap >= 1 && hourGap <= 12) {
return hourGap + "小时前";
} else {
SimpleDateFormat sdf = new SimpleDateFormat("今天 HH:mm");
return sdf.format(date);
}
}
}
}
}
/**
* 获取当前时间戳
*
* @return 时间戳
*/
public static long getCurrentTime() {
Calendar calendar = Calendar.getInstance();
return calendar.getTimeInMillis();
}
/**
* 格式化12小时制 格式:yyyy-MM-dd hh-mm-ss
*
* @param time 时间
* @return
*/
public static String format12Time(long time) {
return format(time, DF_YYYY_MM_DD_h_MM_SS);
}
/**
* 格式化24小时制 格式:yyyy-MM-dd HH-MM-ss
*
* @param time 时间
* @return
*/
public static String format24Time(long time) {
return format(time, DF_YYYY_MM_DD_HH_MM_SS);
}
/**
* 得到当前时间
*
* @return
*/
public static Date getThisTime() {
return new Date();
}
/**
* 获取系统当前日期
*
* @return
*/
public static String getThisTime(String formater) {
return format(getCurrentTime(), formater);
}
/**
* 将日期字符串转成日期
*
* @param strDate 日期字符串
* @param format 格式
* @return
*/
public static Date parseDate(String strDate, String format) {
DateFormat dateFormat = new SimpleDateFormat(format);
Date returnDate = null;
try {
returnDate = dateFormat.parse(strDate);
} catch (ParseException e) {
LogUtils.e("parseDate failed !");
}
return returnDate;
}
/**
* 验证日期是否比当前日期早
*
* @param target1 比较时间1
* @param target2 比较时间2
* @return true 则代表target1比target2晚或等于target2,否则比target2早
*/
public static boolean compareDate(Date target1, Date target2) {
boolean flag = false;
try {
String target1DateTime = format(target1, DF_YYYY_MM_DD_HH_MM_SS);
String target2DateTime = format(target2, DF_YYYY_MM_DD_HH_MM_SS);
if (target1DateTime.compareTo(target2DateTime) <= 0) {
flag = true;
}
} catch (Exception e1) {
System.out.println("比较失败,原因:" + e1.getMessage());
}
return flag;
}
/**
* 得到某个时间点 正数为当前时间之后,负数为当前时间之前
*
* @param year
* @param month
* @param day
* @param hour
* @param minute
* @param second
* @param format
* @return 自定义
*/
public static String getTimePoint(int year, int month, int day, int hour,
int minute, int second, String format) {
Calendar c = Calendar.getInstance();
c.add(Calendar.YEAR, year);
c.add(Calendar.MONTH, month);
c.add(Calendar.DAY_OF_MONTH, day);
c.add(Calendar.HOUR_OF_DAY, hour);
c.add(Calendar.MINUTE, minute);
c.add(Calendar.SECOND, second);
if (format == null) {
return format(c.getTimeInMillis(), DF_YYYY_MM_DD_HH_MM_SS);
}
return format(c.getTimeInMillis(), format);
}
/**
* 格式化时间,自定义格式
*
* @param time 时间
* @param formater 格式化时间用的标签
* @return
*/
public static String format(long time, String formater) {
SimpleDateFormat sdf = new SimpleDateFormat(formater);
return sdf.format(new Date(time));
}
/**
* 将日期以yyyy-MM-dd HH:mm:ss格式化
*
* @param date 日期
* @return
*/
public static String format(Date date, String formater) {
SimpleDateFormat sdf = new SimpleDateFormat(formater);
return sdf.format(date);
}
/**
* 获取当前年
*
* @return 年
*/
public static String getYear() {
return format(getCurrentTime(), "yyyy");
}
/**
* 获取当前月
*
* @return 月
*/
public static String getMonth() {
return format(getCurrentTime(), "MM");
}
/**
* 获取当前日
*
* @return 日
*/
public static String getDay() {
return format(getCurrentTime(), "dd");
}
/**
* 获取当前小时
*
* @return 小时
*/
public static String getHour() {
return format(getCurrentTime(), "HH");
}
/**
* 获取当前小时
*
* @return 小时
*/
public static String getMinute() {
return format(getCurrentTime(), "mm");
}
/**
* 获取某天是星期几
*
* @param date
* @return
*/
public static String getMonthDayWeek(Date date) {
Calendar c = Calendar.getInstance();
c.setTime(date);
int year = c.get(Calendar.YEAR); //获取年
int month = c.get(Calendar.MONTH) + 1; //获取月份,0表示1月份
int day = c.get(Calendar.DAY_OF_MONTH); //获取当前天数
int week = c.get(Calendar.DAY_OF_WEEK);
String weekStr = null;
switch (week) {
case Calendar.SUNDAY:
weekStr = "周日";
break;
case Calendar.MONDAY:
weekStr = "周一";
break;
case Calendar.TUESDAY:
weekStr = "周二";
break;
case Calendar.WEDNESDAY:
weekStr = "周三";
break;
case Calendar.THURSDAY:
weekStr = "周四";
break;
case Calendar.FRIDAY:
weekStr = "周五";
break;
case Calendar.SATURDAY:
weekStr = "周六";
break;
}
return month + "月" + day + "日" + "(" + weekStr + ")";
}
/**
* 获取年龄值
*
* @param birthday
* @return
*/
public static int getAge(String birthday) {
if (StringUtils.isEmpty(birthday)) return 0;
String yearStr = birthday.substring(0, 4);
int integer = Integer.parseInt(yearStr);
int newYear = new GregorianCalendar().get(Calendar.YEAR);
return newYear - integer;
}
}