package com.minggo.pluto.util;
import android.text.TextUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
/**
* 日期工具类
* @author minggo
* @time 2014-12-2下午2:14:11
*/
public class DateUtil {
public static final String YYYY_MM_DD = "yyyy-MM-dd";
public static final String YYYY_MM_DD_HH_MM = "yyyy-MM-dd HH:mm";
public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS,Locale.getDefault());
/**
* 将字符串转化为日期
*
* @param s
* @return
*/
public static Date stringToDateTime(String s) {
if (null == s) {
return new Date();
}
String pattern;
if (s.matches("\\d{4}-\\d{2}-\\d{2}")) {
pattern = YYYY_MM_DD;
} else if (s.matches("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}")) {
pattern = YYYY_MM_DD_HH_MM_SS;
} else {
pattern = YYYY_MM_DD_HH_MM;
}
SimpleDateFormat sdf = new SimpleDateFormat(pattern, Locale.getDefault());
try {
return sdf.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
/**
* 年月日时分秒
* @param date
* @return
*/
public static String getTime(Date date) {
TimeZone t = TimeZone.getTimeZone("GMT+08:00");// 获取东8区TimeZone
Calendar calendar = Calendar.getInstance(t);
if (date == null) {
calendar.setTimeInMillis(System.currentTimeMillis());
} else {
calendar.setTime(date);
}
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int min = calendar.get(Calendar.MINUTE);
int ss = calendar.get(Calendar.SECOND);
int ms = calendar.get(Calendar.MILLISECOND);// 毫秒
String time = year + "-" + (month < 10 ? "0" : "") + month + '-' + (day < 10 ? "0" : "") + day + ' ' + (hour < 10 ? "0" : "")
+ hour + ':' + (min < 10 ? "0" : "") + min + ":" + (ss < 10 ? "0" : "") + ss ;
// + "." + (ms < 10 ? "00" : (ms < 100 ? "0" : "")) + ms;
return time;
}
/**
* 年月日时分秒毫秒
* @param date
* @return
*/
public static String getTimes(Date date) {
TimeZone t = TimeZone.getTimeZone("GMT+08:00");// 获取东8区TimeZone
Calendar calendar = Calendar.getInstance(t);
if (date == null) {
calendar.setTimeInMillis(System.currentTimeMillis());
} else {
calendar.setTime(date);
}
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int min = calendar.get(Calendar.MINUTE);
int ss = calendar.get(Calendar.SECOND);
int ms = calendar.get(Calendar.MILLISECOND);// 毫秒
String time = year + "-" + (month < 10 ? "0" : "") + month + '-' + (day < 10 ? "0" : "") + day + ' ' + (hour < 10 ? "0" : "")
+ hour + ':' + (min < 10 ? "0" : "") + min + ":" + (ss < 10 ? "0" : "") + ss
+ "." + (ms < 10 ? "00" : (ms < 100 ? "0" : "")) + ms;
return time;
}
/**
* 年月日
* @param date
* @return
*/
public static String getDay(Date date) {
TimeZone t = TimeZone.getTimeZone("GMT+08:00");// 获取东8区TimeZone
Calendar calendar = Calendar.getInstance(t);
if (date == null) {
calendar.setTimeInMillis(System.currentTimeMillis());
} else {
calendar.setTime(date);
}
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
String time = year + "-" + (month < 10 ? "0" : "") + month + '-' + (day < 10 ? "0" : "") + day;
return time;
}
public static SimpleDateFormat getSimpleDateFormat(String template) {
simpleDateFormat.applyPattern(template);
return simpleDateFormat;
}
/**
* 格式化取当前时间
*
* @return
*/
public static String getThisDateTime() {
return getSimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(System.currentTimeMillis());
}
/**
* 将yyyy-MM-dd HH:mm:ss格式的时间,同当前时间比对,格式化为:xx分钟前,xx小时前和日期
*
* @param datetime 需比对的时间
* @return
*/
public static String convert_before(String datetime) {
if (TextUtils.isEmpty(datetime)) {
return "";
}
try {
long time = getSimpleDateFormat("yyyy-MM-dd HH:mm").parse(datetime).getTime();
return convert_before(time);
} catch (ParseException e) {
e.printStackTrace();
return "";
}
}
/**
* 将对比后的时间,格式化为:xx分钟前,xx小时前和日期
*
* @param time 需比对的时间
* @return
*/
public static String convert_before(long time) {
if (time < 0)
return String.valueOf(time);
int diffTime = (int) ((System.currentTimeMillis() - time) / 1000);
if (diffTime < 86400 && diffTime > 0) {
if (diffTime < 3600) {
int min = (diffTime / 60);
if (min == 0)
return "刚刚";
else
return (diffTime / 60) + "分钟前";
} else {
return (diffTime / 3600) + "小时前";
}
} else {
Calendar now = Calendar.getInstance();
Calendar c = Calendar.getInstance();
c.setTimeInMillis(time);
if (c.get(Calendar.YEAR) == now.get(Calendar.YEAR) && c.get(Calendar.MONTH) == now.get(Calendar.MONTH)
&& c.get(Calendar.DATE) == now.get(Calendar.DATE)) {
return getSimpleDateFormat("HH:mm").format(c.getTime());
}
return dateInterval(now.getTime().getTime(), c.getTime().getTime()) + "天前";
}
}
/**
* 计算出两个日期之间相差的天数
* 建议date1 大于 date2 这样计算的值为正数
*
* @param date1 日期1
* @param date2 日期2
* @return date1 - date2
*/
public static int dateInterval(long date1, long date2) {
if (date2 > date1) {
date2 = date2 + date1;
date1 = date2 - date1;
date2 = date2 - date1;
}
// Canlendar 该类是一个抽象类
// 提供了丰富的日历字段
// 本程序中使用到了
// Calendar.YEAR 日期中的年份
// Calendar.DAY_OF_YEAR 当前年中的天数
// getActualMaximum(Calendar.DAY_OF_YEAR) 返回今年是 365 天还是366天
Calendar calendar1 = Calendar.getInstance(); // 获得一个日历
calendar1.setTimeInMillis(date1); // 用给定的 long 值设置此 Calendar 的当前时间值。
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) {
day = numerical(maxDays, d1, d2, y1, y2, calendar2);
} else {
day = d1 - d2;
}
return day;
}
/**
* 日期间隔计算
* 计算公式(示例):
* 20121201- 20121212
* 取出20121201这一年过了多少天 d1 = 天数 取出20121212这一年过了多少天 d2 = 天数
* 如果2012年这一年有366天就要让间隔的天数+1,因为2月份有29日。
*
* @param maxDays 用于记录一年中有365天还是366天
* @param d1 表示在这年中过了多少天
* @param d2 表示在这年中过了多少天
* @param y1 当前为2012年
* @param y2 当前为2012年
* @param calendar 根据日历对象来获取一年中有多少天
* @return 计算后日期间隔的天数
*/
public static int numerical(int maxDays, int d1, int d2, int y1, int y2, Calendar calendar) {
int day = d1 - d2;
int betweenYears = y1 - y2;
List<Integer> d366 = new ArrayList<>();
if (calendar.getActualMaximum(Calendar.DAY_OF_YEAR) == 366) {
System.out.println(calendar.getActualMaximum(Calendar.DAY_OF_YEAR));
day += 1;
}
for (int i = 0; i < betweenYears; i++) {
// 当年 + 1 设置下一年中有多少天
calendar.set(Calendar.YEAR, (calendar.get(Calendar.YEAR)) + 1);
maxDays = calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
// 第一个 366 天不用 + 1 将所有366记录,先不进行加入然后再少加一个
if (maxDays != 366) {
day += maxDays;
} else {
d366.add(maxDays);
}
// 如果最后一个 maxDays 等于366 day - 1
if (i == betweenYears - 1 && betweenYears > 1 && maxDays == 366) {
day -= 1;
}
}
for (int i = 0; i < d366.size(); i++) {
// 一个或一个以上的366天
if (d366.size() >= 1) {
day += d366.get(i);
}
}
return day;
}
/**
* 获取当前的Unix时间戳(格式:2015/8/24 16:56:44)
*/
public static long getUnixTimestampByCurrentDate() {
return getUnixTimestampByDate(new Date());
}
/**
* 获取date参数的Unix时间戳(格式:2015/8/24 16:56:44)
*/
public static long getUnixTimestampByDate(Date date) {
return date.getTime() / 1000;
}
/**
* 根据时间戳获取date对象
*/
public static Date getDateByUnixTimestamp(long unixTimestamp) {
return new Date(unixTimestamp * 1000);
}
}