package com.sf.core.util;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.Maps;
import static org.apache.commons.lang.StringUtils.EMPTY;
public class DateUtils {
private static Logger logger = LoggerFactory.getLogger(DateUtils.class);
private static final String YMD = "yyyy-MM-dd";
private static final String YMD1 = "yyyyMMdd";
private static final String YMDHMS = "yyyy-MM-dd HH:mm:ss";
/**
* 获取当前时间 年月日时分秒
* @return
*/
public static String getCurrentTime() {
SimpleDateFormat dateFormat = new SimpleDateFormat(YMDHMS);
Date d = new Date();
return dateFormat.format(d);
}
public static String getCurrentTimeStr(){
String current = getCurrentTime();
String currentStr = current.replaceAll("-","").replaceAll(" ","").replaceAll(":","");
return currentStr;
}
public static String getCurrentTimeStrhms() {
String str = getCurrentTimeStr();
String str1 = str.substring(8,str.length());
return str1;
}
/**
* 获取当前时间 年月日
* @return
*/
public static String getCurrentDate() {
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat(YMD);
return sdf.format(d);
}
public static String getCurrentDateStr() {
String current = getCurrentDate();
String currentStr = current.replaceAll("-", "");
return currentStr;
}
public static String getCurrentDateYMD() {
String date = getCurrentDate();
String [] dates = date.split("-");
StringBuilder sb = new StringBuilder();
sb.append(dates[0]);
sb.append("年");
sb.append(dates[1]);
sb.append("月");
sb.append(dates[2]);
sb.append("日");
return sb.toString();
}
/**
* yyyy-MM-dd 转 yyyy年MM月dd日
*/
public static String getNianYueRi(String yyyy_MM_ddDate) {
String [] dates = yyyy_MM_ddDate.split("-");
StringBuilder sb = new StringBuilder();
sb.append(dates[0]);
sb.append("年");
sb.append(dates[1]);
sb.append("月");
sb.append(dates[2]);
sb.append("日");
return sb.toString();
}
/**
*获得本周一与当前日期相差的天数
*
* @return
*/
public static int getMondayPlus() {
Calendar cd = Calendar.getInstance();
int dayOfWeek = cd.get(Calendar.DAY_OF_WEEK);
if (dayOfWeek == 1) {
return -6;
} else {
return 2 - dayOfWeek;
}
}
/**
* 获得当前周 周一的日期
* @return
*/
public static String getCurrentMonday() {
SimpleDateFormat df = new SimpleDateFormat(YMD);
Calendar cld = Calendar.getInstance(Locale.CHINA);
//以周一为首日
cld.setFirstDayOfWeek(Calendar.MONDAY);
//当前时间
cld.setTimeInMillis(System.currentTimeMillis());
//周一
cld.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
String monday = df.format(cld.getTime());
return monday;
}
/**
* 获得当前周 周日 的日期
* @return
*/
public static String getPreviousSunday() {
SimpleDateFormat df = new SimpleDateFormat(YMD);
Calendar cld = Calendar.getInstance(Locale.CHINA);
//以周一为首日
cld.setFirstDayOfWeek(Calendar.MONDAY);
//当前时间
cld.setTimeInMillis(System.currentTimeMillis());
//周日
cld.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
String weekday = df.format(cld.getTime());
return weekday;
}
/**
* 获取月份 开始日期
* @return
*/
public static String getMinMonthDate(String date) {
SimpleDateFormat dateFormat = new SimpleDateFormat(YMD);
Calendar calendar = Calendar.getInstance();
try {
calendar.setTime(dateFormat.parse(date));
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
return dateFormat.format(calendar.getTime());
} catch (java.text.ParseException e) {
logger.error("getMinMonthDate.error:", e);
}
return null;
}
public static String getMinMonthDateYmd(String date) {
SimpleDateFormat dateFormat = new SimpleDateFormat(YMD1);
Calendar calendar = Calendar.getInstance();
try {
calendar.setTime(dateFormat.parse(date));
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
return dateFormat.format(calendar.getTime());
} catch (java.text.ParseException e) {
logger.error("getMinMonthDate.error:", e);
}
return null;
}
/**
* 获得月份 结束日期
* @return
*/
public static String getMaxMonthDate(String date) {
SimpleDateFormat dateFormat = new SimpleDateFormat(YMD);
Calendar calendar = Calendar.getInstance();
try {
calendar.setTime(dateFormat.parse(date));
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
return dateFormat.format(calendar.getTime());
} catch (java.text.ParseException e) {
logger.error("getMaxMonthDate.error:", e);
}
return null;
}
public static String getMaxMonthDateYmd(String date) {
SimpleDateFormat dateFormat = new SimpleDateFormat(YMD1);
Calendar calendar = Calendar.getInstance();
try {
calendar.setTime(dateFormat.parse(date));
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
return dateFormat.format(calendar.getTime());
} catch (java.text.ParseException e) {
logger.error("getMaxMonthDate.error:", e);
}
return null;
}
/**
* 每月第一天
* @return
*/
public static String getMonthFirstDay() {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.add(Calendar.MONTH, 0);
SimpleDateFormat sdf = new SimpleDateFormat(YMD);
String firstDay = sdf.format(calendar.getTime());
return firstDay;
}
/**
* 每月最后一天
* @return
*/
public static String getMonthLastDay() {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.set(Calendar.DAY_OF_MONTH, 0);
calendar.add(Calendar.MONTH, 1);
SimpleDateFormat sdf = new SimpleDateFormat(YMD);
String firstDay = sdf.format(calendar.getTime());
return firstDay;
}
/**
* 获取当前月天数
* @return
*/
public static int getDaysOfMonth(String date) {
SimpleDateFormat dateFormat = new SimpleDateFormat(YMD);
Calendar calendar = Calendar.getInstance();
try {
calendar.setTime(dateFormat.parse(date));
} catch (ParseException e) {
logger.error("getMaxMonthDate.error:", e);
}
return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
}
/**
* 获取当前时间 年 月 日 时 分 秒
* @return
*/
public static Map<String, String> getCurrentTimeSeparate() {
Map<String, String> map = Maps.newHashMap();
Calendar now = Calendar.getInstance();
map.put("year", String.valueOf(now.get(Calendar.YEAR)));
map.put("month", String.valueOf((now.get(Calendar.MONTH) + 1)));
map.put("today", String.valueOf(now.get(Calendar.DAY_OF_MONTH)));
map.put("hour", String.valueOf(now.get(Calendar.HOUR_OF_DAY)));
map.put("minute", String.valueOf(now.get(Calendar.MINUTE)));
map.put("second", String.valueOf(now.get(Calendar.SECOND)));
return map;
}
/**
* 获取月份的每一天
*
* @param date
* @return
*/
public static List<String> getDayByMonth(String date) {
String[] months = date.split("-");
int yearParam = Integer.parseInt(months[0]);
int monthParam = Integer.parseInt(months[1]);
List<String> list = new ArrayList<String>();
Calendar aCalendar = Calendar.getInstance(Locale.CHINA);
aCalendar.set(yearParam, monthParam, -1);
//年份
int year = aCalendar.get(Calendar.YEAR);
//月份
int month = aCalendar.get(Calendar.MONTH) + 1;
int day = aCalendar.getActualMaximum(Calendar.DATE);
for (int i = 1; i <= day; i++) {
String aDate = null;
if (month < 10 && i < 10) {
aDate = String.valueOf(year) + "-0" + month + "-0" + i;
}
if (month < 10 && i >= 10) {
aDate = String.valueOf(year) + "-0" + month + "-" + i;
}
if (month >= 10 && i < 10) {
aDate = String.valueOf(year) + "-" + month + "-0" + i;
}
if (month >= 10 && i >= 10) {
aDate = String.valueOf(year) + "-" + month + "-" + i;
}
list.add(aDate);
}
return list;
}
/**
* 获取两个时间之间的每一天
*
* @param bigtimeStr
* @param endTimeStr
* @return
* @throws ParseException
*/
public static List<String> getDays(String bigtimeStr, String endTimeStr) throws ParseException {
Date bigtime = new SimpleDateFormat(YMDHMS).parse(bigtimeStr + " 00:00:00");
Date endtime = new SimpleDateFormat(YMDHMS).parse(endTimeStr + " 00:00:00");
//定义一个接受时间的集合
List<Date> lDate = new ArrayList<>();
lDate.add(bigtime);
Calendar calBegin = Calendar.getInstance();
// 使用给定的 Date 设置此 Calendar 的时间
calBegin.setTime(bigtime);
Calendar calEnd = Calendar.getInstance();
// 使用给定的 Date 设置此 Calendar 的时间
calEnd.setTime(endtime);
// 测试此日期是否在指定日期之后
while (endtime.after(calBegin.getTime())) {
// 根据日历的规则,为给定的日历字段添加或减去指定的时间量
calBegin.add(Calendar.DAY_OF_MONTH, 1);
lDate.add(calBegin.getTime());
}
List<String> datas = new LinkedList<>();
for (Date date : lDate) {
datas.add(new SimpleDateFormat(YMD).format(date));
}
return datas;
}
/**
* 时间字符串转时间类型
* @return
*/
public static Date stringTransformDate(String date) {
Date date1 = null;
SimpleDateFormat simdate1 = new SimpleDateFormat(YMD);
try {
date1 = simdate1.parse(date);
} catch (ParseException e) {
logger.error("stringTransformDate.error:", e);
}
return date1;
}
public static String dateTransformDate(Date date){
//可以转成你想要的格式 yyyy/MM/dd HH:mm:ss 等等
SimpleDateFormat format = new SimpleDateFormat(YMDHMS);
String dateString = format.format(date);
return dateString;
}
/**
* 得到当前时间的前几天、后几天
* @return
*/
public static String getDateBefore(int day) {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, day);
Date date = calendar.getTime();
DateFormat df = new SimpleDateFormat(YMD);
String format = df.format(date);
return format;
}
/**
* 获取当前时间的前几个月、后几个月的当天时间
* @return
*/
public static String getMonthBefore(int month) {
SimpleDateFormat format = new SimpleDateFormat(YMD);
Calendar c = Calendar.getInstance();
c.setTime(new Date());
c.add(Calendar.MONTH, month);
Date m = c.getTime();
String mon = format.format(m);
return mon;
}
public static void main(String[] args) {
System.out.println(getNextYearPreDay("20220901",1));
}
public static boolean isAlphaNumeric(String s) {
Pattern p = Pattern.compile("[0-9a-zA-Z]{1,}");
Matcher m = p.matcher(s);
return m.matches();
}
public static boolean isAlpha(String s) {
Pattern p = Pattern.compile("[a-zA-Z]{1,}");
Matcher m = p.matcher(s);
return m.matches();
}
/**
* 获取指定日期的前几年、后几年
* @param date
* @return
*/
public static String getNextYearPreDay(String date,int num) {
SimpleDateFormat format = new SimpleDateFormat(YMD1);
Calendar ca = Calendar.getInstance();
try {
ca.setTime(format.parse(date));
ca.add(Calendar.YEAR, num);
// ca.add(Calendar.MONTH, -1);
ca.add(Calendar.DATE,-1);
Date y = ca.getTime();
String year = format.format(y);
return year;
} catch (Exception e) {
logger.error("getNextYearPreDay.error:", e);
}
return null;
}
/**
* 获取几天前、几天后的前一个月当天时间
* @return
*/
public static String getMonthDay(int month) {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, month);
Date date = calendar.getTime();
SimpleDateFormat format = new SimpleDateFormat(YMD);
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.MONTH, -1);
Date m = c.getTime();
String mon = format.format(m);
return mon;
}
/**
* 获取指定日期的前一天
*
* @param day
* @return
*/
public static String getDay(String day) {
Calendar c = Calendar.getInstance();
Date date = null;
try {
date = new SimpleDateFormat(YMD).parse(day);
} catch (ParseException e) {
e.printStackTrace();
}
c.setTime(date);
int day1 = c.get(Calendar.DATE);
c.set(Calendar.DATE, day1 - 1);
String dayAfter = new SimpleDateFormat(YMD).format(c.getTime());
return dayAfter;
}
/**
* @Description: 获取指定日期的前几天、后几天
* @Author: Lee
* @Date: 2020/10/20
**/
public static String getDays(String dayTime,int day) {
Calendar c = Calendar.getInstance();
Date date = null;
try {
date = new SimpleDateFormat("yyyyMMdd").parse(dayTime);
} catch (ParseException e) {
e.printStackTrace();
}
c.setTime(date);
int day1 = c.get(Calendar.DATE);
c.set(Calendar.DATE, day1 + (day));
String dayAfter = new SimpleDateFormat("yyyyMMdd").format(c.getTime());
return dayAfter;
}
/**
* @Description: 获取两个时间之间存在多少天数,精确到小数位
* @Author: Lee
* @Date: 2020/10/19
**/
public static String getDayTimes(String dateStart, String dateEnd) {
try {
//设置转换的日期格式
SimpleDateFormat sdf = new SimpleDateFormat(YMDHMS);
//开始时间
Date startDate = sdf.parse(dateStart);
//结束时间
Date endDate = sdf.parse(dateEnd);
//获取两个时间之间的时间戳值
long dateNum = (endDate.getTime() - startDate.getTime()) / 1000;
//一天时间戳
long dayNum = 60L * 60 * 24;
double dateDouble = (double) dateNum;
double dayDouble = (double) dayNum;
//保留一位小数计算天数
//设置保留位数
DecimalFormat df = new DecimalFormat("0.00");
String dayTimes = df.format(dateDouble / dayDouble);
return dayTimes;
} catch (ParseException e) {
return "0";
}
}
/**
* 将yyyyMMdd日期字符串转成yyyy-MM-dd格式
*
* @author 80001117
* @Date 2017年5月26日 上午11:33:58
* @param dateStr
* @return
*/
public static final String dateStrSwitch(String dateStr) {
if (dateStr != null && dateStr.length() == 8) {
try {
new SimpleDateFormat("yyyyMMdd").parse(dateStr);
String year = dateStr.substring(0, 4);
String month = dateStr.substring(4, 6);
String day = dateStr.substring(6, 8);
return year + "-" + month + "-" + day;
} catch (ParseException e) {
logger.error(e.getMessage(), e);
}
}
return EMPTY;
}
/**
* 将yyyy-MM-dd日期字符串转成yyyyMMdd格式
*
* @author 80001117
* @Date 2017年5月26日 下午1:59:03
* @return
*/
public static final String dateStrReplace(String dateStr) {
return dateStr == null ? EMPTY : dateStr.replaceAll("-", EMPTY);
}
/**
* 校验日期格式是否正确
* 样例: String date = "20220801";
* isLegalDate(date.length(),date,"yyyyMMdd")
* @param length
* @param sDate
* @param format
* @return
*/
public static boolean isLegalDate(int length, String sDate, String format) {
int legalLen = length;
if ((sDate == null) || (sDate.length() != legalLen)) {
return false;
}
DateFormat formatter = new SimpleDateFormat(format);
try {
Date date = formatter.parse(sDate);
return sDate.equals(formatter.format(date));
} catch (Exception e) {
return false;
}
}
}
java 获取当前时间的上下几月、上下几周、前后几天等各种日期转换
于 2020-11-09 20:21:45 首次发布