package com.anthony.library.utils;
import android.text.TextUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
/**
* TimeUtils
*/
public class TimeUtils {
public static final SimpleDateFormat DEFAULT_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static final SimpleDateFormat DATE_FORMAT_DATE = new SimpleDateFormat("yyyy-MM-dd");
// 日期格式为 2016-02-03 17:04:58
public static final String PATTERN_DATE = "yyyy年MM月dd日";
public static final String PATTERN_TIME = "HH:mm:ss";
public static final String PATTERN_SPLIT = " ";
public static final String PATTERN = PATTERN_DATE + PATTERN_SPLIT + PATTERN_TIME;
public static final long ONE_SECOND_MILLIONS = 1000;
public static final long ONE_MINUTE_MILLIONS = 60 * ONE_SECOND_MILLIONS;
public static final long ONE_HOUR_MILLIONS = 60 * ONE_MINUTE_MILLIONS;
public static final long ONE_DAY_MILLIONS = 24 * ONE_HOUR_MILLIONS;
public static final int DAY_OF_YEAR = 365;
private TimeUtils() {
throw new AssertionError();
}
/**
* long time to string
*
* @param timeInMillis
* @param dateFormat
* @return
*/
public static String getTime(long timeInMillis, SimpleDateFormat dateFormat) {
return dateFormat.format(new Date(timeInMillis));
}
/**
* long time to string, format is {@link #DEFAULT_DATE_FORMAT}
*
* @param timeInMillis
* @return
*/
public static String getTime(long timeInMillis) {
return getTime(timeInMillis, DEFAULT_DATE_FORMAT);
}
/**
* get current time in milliseconds
*
* @return
*/
public static long getCurrentTimeInLong() {
return System.currentTimeMillis();
}
/**
* get current time in milliseconds, format is {@link #DEFAULT_DATE_FORMAT}
*
* @return
*/
public static String getCurrentTimeInString() {
return getTime(getCurrentTimeInLong());
}
/**
* get current time in milliseconds
*
* @return
*/
public static String getCurrentTimeInString(SimpleDateFormat dateFormat) {
return getTime(getCurrentTimeInLong(), dateFormat);
}
public static long getNowTime() {
return System.currentTimeMillis();
}
private static final long ONE_MINUTE = 60000L;
private static final long ONE_HOUR = 3600000L;
private static final long ONE_DAY = 86400000L;
private static final long ONE_WEEK = 604800000L;
private static final String ONE_SECOND_AGO = "秒前";
private static final String ONE_MINUTE_AGO = "分钟前";
private static final String ONE_HOUR_AGO = "小时前";
private static final String ONE_DAY_AGO = "天前";
private static final String ONE_MONTH_AGO = "月前";
private static final String ONE_YEAR_AGO = "年前";
/**
* 转化为几天前这种形式。
*
* @param millis
* @return
*/
public static String format(long millis) {
long delta = System.currentTimeMillis() - millis;
if (delta < 1L * ONE_MINUTE) {
// long seconds = toSeconds(delta);
// return (seconds <= 0 ? 1 : seconds) + ONE_SECOND_AGO;
return 1 + ONE_MINUTE_AGO;
}
if (delta < 45L * ONE_MINUTE) {
long minutes = toMinutes(delta);
return (minutes <= 0 ? 1 : minutes) + ONE_MINUTE_AGO;
}
if (delta < 24L * ONE_HOUR) {
long hours = toHours(delta);
return (hours <= 0 ? 1 : hours) + ONE_HOUR_AGO;
}
if (delta < 48L * ONE_HOUR) {
return "昨天";
}
if (delta < 30L * ONE_DAY) {
long days = toDays(delta);
return (days <= 0 ? 1 : days) + ONE_DAY_AGO;
}
if (delta < 12L * 4L * ONE_WEEK) {
long months = toMonths(delta);
return (months <= 0 ? 1 : months) + ONE_MONTH_AGO;
} else {
long years = toYears(delta);
return (years <= 0 ? 1 : years) + ONE_YEAR_AGO;
}
}
private static long toSeconds(long date) {
return date / 1000L;
}
private static long toMinutes(long date) {
return toSeconds(date) / 60L;
}
private static long toHours(long date) {
return toMinutes(date) / 60L;
}
private static long toDays(long date) {
return toHours(date) / 24L;
}
private static long toMonths(long date) {
return toDays(date) / 30L;
}
private static long toYears(long date) {
return toMonths(date) / 365L;
}
//一天的秒数
public static final long ONE_DAY_TIME = 24 * 60 * 60;
/**
* 获取年月日时间
*/
public static String getNYYMMDD() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String yymmddString = sdf.format(new Date());
return yymmddString;
}
/**
* 获取年月日时间
*/
public static String getNYYMMDD(int day) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Date date = new Date();
long now = date.getTime();
long next = now + day * ONE_DAY_TIME * 1000;
String yymmddString = sdf.format(next);
return yymmddString;
}
/**
* convert time str
*
* @param time
* @return
*/
public static String convertTime(int time) {
time /= 1000;
int minute = time / 60;
int second = time % 60;
minute %= 60;
return String.format("%02d:%02d", minute, second);
}
/**
* get format date
*
* @param timemillis
* @return
*/
public static String getFormatDate(long timemillis) {
return new SimpleDateFormat("yyyy年MM月dd日").format(new Date(timemillis));
}
/**
* 获取日期 PATTERN_DATE 部分
*/
public static String getDate(String date) {
if (TextUtils.isEmpty(date) || !date.contains(PATTERN_SPLIT)) {
return "";
}
return date.split(PATTERN_SPLIT)[0];
}
/**
* 原有日期上累加月
*
* @return 累加后的日期 PATTERN_DATE 部分
*/
public static String addMonth(String date, int moonCount) {
//如果date为空 就用当前时间
if (TextUtils.isEmpty(date)) {
SimpleDateFormat df = new SimpleDateFormat(PATTERN_DATE + PATTERN_SPLIT + PATTERN_TIME);
date = df.format(new Date());
}
Calendar calendar = str2calendar(date);
calendar.add(Calendar.MONTH, moonCount);
return getDate(calendar2str(calendar));
}
/**
* 计算天数差
*/
public static int calculateDayDiff(Date targetTime, Date compareTime) {
boolean sameYear = isSameYear(targetTime, compareTime);
if (sameYear) {
return calculateDayDiffOfSameYear(targetTime, compareTime);
} else {
int dayDiff = 0;
// 累计年数差的整年天数
int yearDiff = calculateYearDiff(targetTime, compareTime);
dayDiff += yearDiff * DAY_OF_YEAR;
// 累计同一年内的天数
dayDiff += calculateDayDiffOfSameYear(targetTime, compareTime);
return dayDiff;
}
}
/**
* 计算同一年内的天数差
*/
public static int calculateDayDiffOfSameYear(Date targetTime, Date compareTime) {
if (targetTime == null || compareTime == null) {
return 0;
}
Calendar tarCalendar = Calendar.getInstance();
tarCalendar.setTime(targetTime);
int tarDayOfYear = tarCalendar.get(Calendar.DAY_OF_YEAR);
Calendar compareCalendar = Calendar.getInstance();
compareCalendar.setTime(compareTime);
int comDayOfYear = compareCalendar.get(Calendar.DAY_OF_YEAR);
return tarDayOfYear - comDayOfYear;
}
/**
* 计算年数差
*/
public static int calculateYearDiff(Date targetTime, Date compareTime) {
if (targetTime == null || compareTime == null) {
return 0;
}
Calendar tarCalendar = Calendar.getInstance();
tarCalendar.setTime(targetTime);
int tarYear = tarCalendar.get(Calendar.YEAR);
Calendar compareCalendar = Calendar.getInstance();
compareCalendar.setTime(compareTime);
int comYear = compareCalendar.get(Calendar.YEAR);
return tarYear - comYear;
}
/**
* 计算月数差
*
* @param targetTime
* @param compareTime
* @return
*/
public static int calculateMonthDiff(String targetTime, String compareTime) {
return calculateMonthDiff(str2date(targetTime, PATTERN_DATE),
str2date(compareTime, PATTERN_DATE));
}
/**
* 计算月数差
*
* @param targetTime
* @param compareTime
* @return
*/
public static int calculateMonthDiff(Date targetTime, Date compareTime) {
Calendar tarCalendar = Calendar.getInstance();
tarCalendar.setTime(targetTime);
int tarYear = tarCalendar.get(Calendar.YEAR);
int tarMonth = tarCalendar.get(Calendar.MONTH);
Calendar compareCalendar = Calendar.getInstance();
compareCalendar.setTime(compareTime);
int comYear = compareCalendar.get(Calendar.YEAR);
int comMonth = compareCalendar.get(Calendar.MONTH);
return ((tarYear - comYear) * 12 + tarMonth - comMonth);
}
/**
* 是否为同一年
*/
public static boolean isSameYear(Date targetTime, Date compareTime) {
if (targetTime == null || compareTime == null) {
return false;
}
Calendar tarCalendar = Calendar.getInstance();
tarCalendar.setTime(targetTime);
int tarYear = tarCalendar.get(Calendar.YEAR);
Calendar compareCalendar = Calendar.getInstance();
compareCalendar.setTime(compareTime);
int comYear = compareCalendar.get(Calendar.YEAR);
return tarYear == comYear;
}
public static Date str2date(String str, String format) {
Date date = null;
try {
if (str != null) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
date = sdf.parse(str);
}
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
public static Date str2date(String str) {
return str2date(str, PATTERN);
}
public static String date2str(Date date) {
return date2str(date, PATTERN);
}
public static String date2str(Date date, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.CHINA);
return sdf.format(date);
}
public static Calendar str2calendar(String str) {
Calendar calendar = null;
Date date = str2date(str);
if (date != null) {
calendar = Calendar.getInstance();
calendar.setTime(date);
}
return calendar;
}
public static Calendar str2calendar(String str, String format) {
Calendar calendar = null;
Date date = str2date(str, format);
if (date != null) {
calendar = Calendar.getInstance();
calendar.setTime(date);
}
return calendar;
}
public static String calendar2str(Calendar calendar) {
return date2str(calendar.getTime());
}
public static String calendar2str(Calendar calendar, String format) {
return date2str(calendar.getTime(), format);
}
}