日期处理工具类(2)

/**
*
*/
package com.teradata.springboot.util;

import com.teradata.springboot.common.bean.R;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;

/**
* 时间工具类
*
* @author t-xiabin
*
*/
public class DateTimeUtil {

public static final String DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static final String DEFAULT_DAY_FORMAT = "yyyy-MM-dd";

public static String getToday() {
return getToday(DEFAULT_DAY_FORMAT);
}

public static String getToday(String formatStr) {
return dateToStr(new Date(), formatStr);
}

/**
* 获取两个时间字符串的时间差(毫秒数)
*
* @param startDateTime
* 开始时间
* @param endDateTime
* 结束时间
* @return
*/
public static long getMillisForTimeDifference(String startDateTime, String endDateTime) {
return getMillisForTimeDifference(startDateTime, endDateTime, DEFAULT_FORMAT);
}

/**
* 获取两个时间字符串的时间差(毫秒数)
*
* @param startDateTime
* 开始时间
* @param endDateTime
* 结束时间
* @param dateTimeType
* 时间格式(如:yyyy-MM-dd HH:mm:ss
* @return
*/
public static long getMillisForTimeDifference(String startDateTime, String endDateTime, String dateTimeType) {
DateTime dateTimeStart = str2DateTime(startDateTime, dateTimeType);
DateTime dateTimeEnd = str2DateTime(endDateTime, dateTimeType);

if (dateTimeStart.isAfter(dateTimeEnd)) {
DateTime temp = dateTimeStart;
dateTimeStart = dateTimeEnd;
dateTimeEnd = temp;
}
return dateTimeEnd.getMillis() - dateTimeStart.getMillis();
}

/**
* 时间字符串转换成时间
*
* @param dateTimeStr
* 时间字符串
* @return
*/
public static Date str2Date(String dateTimeStr) {
return str2Date(dateTimeStr, DEFAULT_FORMAT);
}

/**
* 时间字符串转换成时间
*
* @param dateTimeStr
* 时间字符串
* @param formatStr
* 时间格式
* @return
*/
public static Date str2Date(String dateTimeStr, String formatStr) {
DateTime dateTime = str2DateTime(dateTimeStr, formatStr);
return dateTime.toDate();
}

/**
* 时间转换成字符串
*
* @param date
* 时间
* @return
*/
public static String dateToStr(Date date) {
return dateToStr(date, DEFAULT_FORMAT);
}

/**
* 时间转换成字符串
*
* @param date
* 时间
* @param formatStr
* 时间格式
* @return
*/
public static String dateToStr(Date date, String formatStr) {
if (date == null) {
return StringUtils.EMPTY;
}
DateTime dateTime = new DateTime(date);
return dateTime.toString(formatStr);
}

/**
* 时间字符串转换成datetime
*
* @param dateTimeStr
* 时间字符串
* @return
*/
public static DateTime str2DateTime(String dateTimeStr) {
return str2DateTime(dateTimeStr, DEFAULT_FORMAT);
}

/**
* 时间字符串转换成datetime
*
* @param dateTimeStr
* 时间字符串
* @param formatStr
* 时间格式
* @return
*/
public static DateTime str2DateTime(String dateTimeStr, String formatStr) {
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern(formatStr);
return dateTimeFormatter.parseDateTime(dateTimeStr);
}


/**
* 当前日期加减指定日期并返回指定格式的日期字符串
* 例如,要从日历的当前时间中减去5天,可以通过调用:
* dateAdd("yyyyMMdd",-5);
* @param format 期待返回的日期字符串的格式
* @param amount 预期加减日期的量
* @return
*/
public static String dateAdd(String format, int amount) {
return addByCalendarField(format, amount, Calendar.DAY_OF_MONTH);
}

/**
* 当前日期加减指定月数并返回指定格式的日期字符串
* @param format 期待返回的日期字符串的格式
* @param amount 预期加减月的量
* @return
*/
public static String addMonth(String format, int amount) {
return addByCalendarField(format, amount, Calendar.MONTH);
}

/**
* 当前日期加减指定日历字段并返回指定格式的日期字符串
* @param format 期待返回的日期字符串的格式
* @param amount 预期加减的量
* @param calendarField 日历字段(如:Calendar.DAY_OF_MONTHCalendar.MONTH等)
* @return
*/
public static String addByCalendarField(String format, int amount, int calendarField) {
return addByCalendarField(null, format, amount, calendarField);
}

/**
* 指定时间加减指定日历字段并返回指定格式的日期字符串
* @param date 指定时间
* @param format 期待返回的日期字符串的格式
* @param amount 预期加减的量
* @param calendarField 日历字段(如:Calendar.DAY_OF_MONTHCalendar.MONTH等)
* @return
*/
public static String addByCalendarField(Date date, String format, int amount, int calendarField) {
Calendar calendar = Calendar.getInstance();
if (null != date) {
calendar.setTime(date);
}
calendar.add(calendarField, amount);
Date time = calendar.getTime();
return dateToStr(time, format);
}

/**
* Date LocalDate
*/
private static LocalDate dateToLocalDate(Date date) {
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
return localDateTime.toLocalDate();
}

/**
* LocalDateTime Date
*/
private static Date localDateTimeToUdate(LocalDateTime localDateTime) {
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDateTime.atZone(zone).toInstant();
return Date.from(instant);
}

/**
* LocalDate Date
*/
private static Date localDateToDate(LocalDate localDate) {
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
Date date = Date.from(instant);
return date;
}

/**
* Date LocalDateTime
*/
private static LocalDateTime dateToLocalDateTime(Date date) {
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
return LocalDateTime.ofInstant(instant, zone);
}

/**
* 后面几月日期
* @param date
* @param months
* @return
*/
public static Date plusMonths(Date date, Integer months) {
if (Objects.isNull(date)) { date =
new Date(); }

LocalDateTime localDateTime = dateToLocalDateTime(date);
LocalDateTime newLocalDateTime = localDateTime.plusMonths(months);
return localDateTimeToUdate(newLocalDateTime); }


/**
* 后面几天日期
* @param date
* @param days
* @return
*/
public static Date plusDays(Date date, Integer days) {
if (Objects.isNull(date)) { date =
new Date(); }

LocalDateTime localDateTime = dateToLocalDateTime(date);
LocalDateTime newLocalDateTime = localDateTime.plusDays(days);
return localDateTimeToUdate(newLocalDateTime); }


/**
* 向前推一天
* @param date
* @param days
* @return
*/
public static Date plusDaysByDate(Date date, Integer days) {
if (Objects.isNull(date)) { date =
new Date(); }

LocalDate localDate = dateToLocalDate(date);
LocalDate newLocalDate = localDate.plusDays(days);
return localDateToDate(newLocalDate); }


public static Date plusHours(Date date, Integer hours) {
if (Objects.isNull(date)) { date =
new Date(); }

LocalDateTime localDateTime = dateToLocalDateTime(date);
LocalDateTime newLocalDateTime = localDateTime.plusHours(hours);
return localDateTimeToUdate(newLocalDateTime); }


/**
* 后面几分钟的日期
* @param date
* @param minutes
* @return
*/
public static Date plusMin(Date date, Long minutes) {
if (Objects.isNull(date)) { date =
new Date(); }

LocalDateTime localDateTime = dateToLocalDateTime(date);
LocalDateTime newLocalDateTime = localDateTime.plusMinutes(minutes);
return localDateTimeToUdate(newLocalDateTime); }


/**
* 后面几秒的日期
* @param date
* @param seconds
* @return
*/
public static Date plusSeconds(Date date, Long seconds) {
if (Objects.isNull(date)) { date =
new Date(); }

LocalDateTime localDateTime = dateToLocalDateTime(date);
LocalDateTime newLocalDateTime = localDateTime.plusSeconds(seconds);
return localDateTimeToUdate(newLocalDateTime); }


/**
* 获取月份之内的月份详单
*
* @return
*/
public static List<String> getMonthTimeList(String startTime, String endTime, String format) {
ArrayList<String> result = new ArrayList<>();
try {
SimpleDateFormat sdf = new SimpleDateFormat(format);
Calendar min = Calendar.getInstance();
Calendar max = Calendar.getInstance();
min.setTime(sdf.parse(startTime));
min.set(min.get(Calendar.YEAR), min.get(Calendar.MONTH), 1);

max.setTime(sdf.parse(endTime));
max.set(max.get(Calendar.YEAR), max.get(Calendar.MONTH), 2);

Calendar curr = min;
while (curr.before(max)) {
result.add(sdf.format(curr.getTime()));
curr.add(Calendar.MONTH, 1); } }

catch (ParseException e) { e.printStackTrace(); }



return result; }


/**
* 获取区间小时节点
* @param startTime
* @param endTime
* @param format
* @return
*/
public static List<String> getDayHourList(String startTime, String endTime, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date dBegin = null;
Date dEnd = null;
try {
dBegin = sdf.parse(startTime);
dEnd = sdf.parse(endTime); }
catch (ParseException e) { e.printStackTrace(); }


List<String> daysStrList = new ArrayList<String>();
daysStrList.add(sdf.format(dBegin).substring(0,13)+":00:00");
Calendar calBegin = Calendar.getInstance();
calBegin.setTime(dBegin);
Calendar calEnd = Calendar.getInstance();
calEnd.setTime(dEnd);
while (dEnd.after(calBegin.getTime())) {
calBegin.add(Calendar.HOUR_OF_DAY, 1);
String dayStr = sdf.format(calBegin.getTime());
String ans = dayStr.substring(0,13)+":00:00";
daysStrList.add(ans);
//7天内 7*24
if(daysStrList.size()>168)
throw new RuntimeException("小时监测最多选择七天!"); }

return daysStrList; }


public static Integer getDayHourList2(String startTime, String endTime, String format) {
Integer ans = 1;
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date dBegin = null;
Date dEnd = null;
try {
dBegin = sdf.parse(startTime);
dEnd = sdf.parse(endTime); }
catch (ParseException e) { e.printStackTrace(); }


Calendar calBegin = Calendar.getInstance();
calBegin.setTime(dBegin);
Calendar calEnd = Calendar.getInstance();
calEnd.setTime(dEnd);
while (dEnd.after(calBegin.getTime())) {
calBegin.add(Calendar.HOUR_OF_DAY, 1);
String dayStr = sdf.format(calBegin.getTime());
System.out.println(dayStr);
ans++; }

return ans; }


/**
* 获取事件段内的日期详单
*
* @return
*/
public static List<String> getDayTimeList(String startTime, String endTime, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date dBegin = null;
Date dEnd = null;
try {
dBegin = sdf.parse(startTime);
dEnd = sdf.parse(endTime); }
catch (ParseException e) { e.printStackTrace(); }


List<String> daysStrList = new ArrayList<String>();
daysStrList.add(sdf.format(dBegin));
Calendar calBegin = Calendar.getInstance();
calBegin.setTime(dBegin);
Calendar calEnd = Calendar.getInstance();
calEnd.setTime(dEnd);
while (dEnd.after(calBegin.getTime())) {
calBegin.add(Calendar.DAY_OF_MONTH, 1);
String dayStr = sdf.format(calBegin.getTime());
daysStrList.add(dayStr); }

return daysStrList; }



/**
* 校验时间格式
* @param startTime
* @param endTime
* @return
*/
public static R<String> judgeMonthDate(String startTime, String endTime,boolean isHour) {
String formate = "";
if(!isHour) {
formate = "yyyy-MM-dd"; }

else
{
formate = "yyyy-MM-dd HH:mm:ss"; }


if (startTime.length() < formate.length() || endTime.length() < formate.length()) {
return R.error("开始时间或结束时间不符合日期格式"); }

Date startDate = DateTimeUtil.str2Date(startTime, formate);
Date endDate = DateTimeUtil.str2Date(endTime, formate);

if ((startDate.getTime() - endDate.getTime()) > 0) {
return R.error("开始时间要小于结束时间"); }

return R.ok(); }


public static void main(String[] args) {
String date = "20200609";
System.out.println(str2Date(date, "yyyyMMdd"));

System.out.println(DateTimeUtil.addByCalendarField("HH:00", -1, Calendar.HOUR_OF_DAY)); }


/**
* yyyymmddyyyy-mm-dd 相互转换工具
* @param timeStr 时间字符串
* @param isSecond 是否是秒 1为是 0 为否
* @param format 1yyyy-mm-ddyyyymmdd 0相反
* @return
* 2000-10-11 10:11:23
* 20001011101123
*/
public static String transferTimeFormat(String timeStr,boolean isSecond,boolean format){
String ans = "";
if(format){
for (int i = 0; i < timeStr.length() ; i++) {
if(timeStr.charAt(i)-'0'>=0 && timeStr.charAt(i)-'0'<=9) {

ans += timeStr.charAt(i); } }


return ans; }

else
{
if (isSecond){
for (int i = 0; i < 4 ; i++) {
ans += timeStr.charAt(i); }

ans+='-';
for (int i = 4; i < 6 ; i++) {
ans += timeStr.charAt(i); }

ans+='-';
for (int i = 6; i < 8 ; i++) {
ans += timeStr.charAt(i); }

ans+=' ';
for (int i = 8; i < 10 ; i++) {
ans += timeStr.charAt(i); }

ans+=':';
for (int i = 10; i < 12 ; i++) {
ans += timeStr.charAt(i); }

ans+=':';
for (int i = 12; i < 14 ; i++) {
ans += timeStr.charAt(i); } }


else{
for (int i = 0; i < 4 ; i++) {
ans += timeStr.charAt(i); }

ans+='-';
for (int i = 4; i < 6 ; i++) {
ans += timeStr.charAt(i); }

ans+='-';
for (int i = 6; i < 8 ; i++) {
ans += timeStr.charAt(i); } }


return ans; } }}




posted @ 2023-02-10 09:46  扬帆起航$  阅读(48)  评论(0)    收藏  举报