package me.hao0.antares.store.util;
import com.google.common.base.Strings;
import org.joda.time.DateTime;
import org.joda.time.Interval;
import org.joda.time.Period;
import org.joda.time.format.DateTimeFormat;
import java.util.Date;
import java.util.regex.Pattern;
/**
* Author: haolin
* Email: haolin.h0@gmail.com
* Date: 17/10/15
*/
public class Dates {
private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
/**
* 简单的日期格式校验(yyyy-MM-dd)
* @param date 输入日期
* @return 有效返回true, 反之false
*/
public static Boolean isValidDate(String date){
return isValidDate(date, "\\d{4}-\\d{2}-\\d{2}");
}
/**
* 简单的日期格式校验(yyyy-MM-dd)
* @param date 输入日期
* @param pattern 日期格式
* @return 有效返回true, 反之false
*/
public static Boolean isValidDate(String date, String pattern){
return !Strings.isNullOrEmpty(date)
&& Pattern.compile(pattern).matcher(date).matches();
}
/**
* 获取当前日期对象
* @return 当前日期对象
*/
public static Date now(){
return new Date();
}
/**
* 获取当前日期字符串
* @param format 日期格式
* @return 当前日期字符串
*/
public static String now(String format){
return format(now(), format);
}
/**
* 转换日期字符串为日期对象(默认格式: yyyy-MM-dd HH:mm:ss)
* @param dateStr 日期字符串
* @return 日期对象
*/
public static Date toDate(String dateStr){
return toDate(dateStr, DEFAULT_DATE_FORMAT);
}
/**
* 转换日期即字符串为Date对象
* @param dateStr 日期字符串
* @param pattern 日期格式
* @return 日期对象
*/
public static Date toDate(String dateStr, String pattern){
return DateTimeFormat.forPattern(pattern).parseDateTime(dateStr).toDate();
}
/**
* 生成时间
* @param millis 毫秒
* @return 日期
*/
public static Date toDate(long millis) {
return new DateTime(millis).toDate();
}
/**
* 格式化日期对象
* @param date 日期对象
* @param format 日期格式
* @return 当前日期字符串
*/
public static String format(Date date, String format){
return new DateTime(date).toString(format);
}
/**
* 格式化日期对象,格式为yyyy-MM-dd HH:mm:ss
* @param date 日期对象
* @return 日期字符串
*/
public static String format(Date date){
return new DateTime(date).toString(DEFAULT_DATE_FORMAT);
}
/**
* 格式化日期对象,格式为yyyy-MM-dd HH:mm:ss
* @param mills 毫秒
* @return 日期字符串
*/
public static String format(Long mills){
return new DateTime(mills).toString(DEFAULT_DATE_FORMAT);
}
/**
* 格式化日期对象
* @param mills 毫秒
* @param pattern 格式
* @return 日期字符串
*/
public static String format(Long mills, String pattern){
return new DateTime(mills).toString(pattern);
}
/**
* 计算两个日期的时间差(单位:秒)
*
* @param startTime 开始时间
* @param endTime 结束时间
* @return 时间间隔
*/
public static long timeInterval(Date startTime, Date endTime) {
long start = startTime.getTime();
long end = endTime.getTime();
return (end - start) / 1000;
}
/**
* 计算两个日期的时间跨度
* @param startTime 开始时间
* @param endTime 结束时间
* @return 两个日期的时间跨度,如 1d 2h 3m
*/
public static String timeIntervalStr(Date startTime, Date endTime){
Interval interval = new Interval(startTime.getTime(), endTime.getTime());
Period period = interval.toPeriod();
StringBuilder str = new StringBuilder();
if (period.getYears() > 0){
str.append(period.getMonths()).append("y, ");
}
if (period.getMonths() > 0){
str.append(period.getMonths()).append("M, ");
}
if (period.getDays() > 0){
str.append(period.getDays()).append("d, ");
}
if (period.getHours() > 0){
str.append(period.getHours()).append("h, ");
}
if (period.getMinutes() > 0){
str.append(period.getMinutes()).append("m, ");
}
if (period.getSeconds() > 0){
str.append(period.getSeconds()).append("s");
}
return str.toString();
}
/**
* 获取指定日期当天的开始时间
* @param date 日期
* @return 时间
*/
public static Date startOfDay(Date date) {
return new DateTime(date).withTimeAtStartOfDay().toDate();
}
/**
* 获取指定日期当天的结束时间
* @param date 日期
* @return 时间
*/
public static Date endOfDay(Date date) {
return new DateTime(date).millisOfDay().withMaximumValue().toDate();
}
/**
* 获取本周周几的日期对象
* @param day 1:星期一,2:星期二,...
* @return 本周周几的日期对象
*/
public static Date dayOfWeek(Integer day){
return new DateTime(DateTime.now().toString("yyyy-MM-dd")).withDayOfWeek(day).toDate();
}
/**
* 获取本月第几天日期对象
* @param day 1:第一天,2:第二天,...
* @return 本月第几天日期对象
*/
public static Date dayOfMonth(Integer day){
return new DateTime(DateTime.now().toString("yyyy-MM-dd")).withDayOfMonth(day).toDate();
}
/**
* 获取本年第几天日期对象
* @param day 1:第一天,2:第二天,...
* @return 本年第几天日期对象
*/
public static Date dayOfYear(Integer day){
return new DateTime(DateTime.now().toString("yyyy-MM-dd")).withDayOfYear(day).toDate();
}
/**
* 增加分钟
* @param date 时间
* @param numOfMinutes 分钟数
* @return 时间
*/
public static Date addMinutes(Date date, int numOfMinutes) {
return new DateTime(date).plusMinutes(numOfMinutes).toDate();
}
/**
* 增加小时
* @param date 时间
* @param numOfHours 小时数
* @return 时间
*/
public static Date addHours(Date date, int numOfHours) {
return new DateTime(date).plusHours(numOfHours).toDate();
}
/**
* 增加天数
* @param date 时间
* @param numdays 天数
* @return 时间
*/
public static Date addDays(Date date, int numdays) {
return new DateTime(date).plusDays(numdays).toDate();
}
/**
* 增加周
* @param date 时间
* @param numWeeks 周数
* @return 时间
*/
public static Date addWeeks(Date date, int numWeeks) {
return new DateTime(date).plusWeeks(numWeeks).toDate();
}
/**
* 增加月份
* @param date 时间
* @param numMonths 月数
* @return 时间
*/
public static Date addMonths(Date date, int numMonths) {
return new DateTime(date).plusMonths(numMonths).toDate();
}
/**
* 增加年
* @param date 时间
* @param numYears 年数
* @return 时间
*/
public static Date addYears(Date date, int numYears) {
return new DateTime(date).plusYears(numYears).toDate();
}
/**
* 日期a是否大于日期b
* @param a 日期a
* @param b 日期b
* @return 大于返回true,反之false
*/
public static Boolean isAfter(Date a, Date b){
return new DateTime(a).isAfter(b.getTime());
}
/**
* 日期a是否大于当前日期
* @param a 日期a
* @return 大于返回true,反之false
*/
public static Boolean isAfterNow(Date a){
return new DateTime(a).isAfterNow();
}
/**
* 日期a是否小于日期b
* @param a 日期a
* @param b 日期b
* @return 小于返回true,反之false
*/
public static Boolean isBefore(Date a, Date b){
return new DateTime(a).isBefore(b.getTime());
}
/**
* 日期a是否大于当前日期
* @param a 日期a
* @return 小于返回true,反之false
*/
public static Boolean isBeforeNow(Date a){
return new DateTime(a).isBeforeNow();
}
/**
* 获得当前月的第一天
* @param date 日期
* @return 当前月的第一天
*/
public static Date startDateOfMonth(Date date) {
DateTime dateTime = new DateTime(date);
return dateTime.dayOfMonth().withMinimumValue().toDate();
}
/**
* 获得当前月的最后一天
* @param date 日期
* @return 当前月的最后一天
*/
public static Date endDateOfMonth(Date date) {
DateTime dateTime = new DateTime(date);
return dateTime.dayOfMonth().withMaximumValue().toDate();
}
/**
* 获得当前周第一天,周一
* @param date 日期
* @return 当前周第一天
*/
public static Date startDateOfWeek(Date date){
DateTime dateTime = new DateTime(date);
return dateTime.dayOfWeek().withMinimumValue().toDate();
}
/**
* 获得当前周最后一天 周日
* @param date 日期
* @return 当前周最后一天
*/
public static Date endDateOfWeek(Date date){
DateTime dateTime = new DateTime(date);
return dateTime.dayOfWeek().withMaximumValue().toDate();
}
}