最近在项目中遇到了时间换算的问题,特意复习了一下,做个总结
写了一个关于时间的工具类,平常遇到关于时间转换的问题都可以解决
package com.zknw.util;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.Format;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* 工具类模块 --Date处理
*
* @author wzx1235
* @since 1.0
*/
public class DateTools {
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
/**
* 得到日期时间字符串 精确到秒
*/
public static String format(Long time) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return df.format(new Date(time));
}
/**
* 描述:日期转换为字都串 wang 2016年10月8日 下午3:02:20
*
* @param date
* @return
*
*/
public static String ConverToString(Date date) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return df.format(date);
}
/**
* 根据字符串日期获取日期类型
* @param timestr
* @return
*/
public static Date paraseStringToDate(String timestr)//将字符串转化为日期
{
Date date=null;
Format f = new SimpleDateFormat("yyyy-MM-dd");
try {
date = (Date) f.parseObject(timestr);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return date;
}
/**
* 获取每个月的开始时间
* @param date
* @return
*/
public static Date getMonthStart(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int index = calendar.get(Calendar.DAY_OF_MONTH);
calendar.add(Calendar.DATE, (1 - index));
return calendar.getTime();
}
/**
* 获取每个月的结束时间
* @param date
* @return
*/
public static Date getMonthEnd(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.MONTH, 1);
int index = calendar.get(Calendar.DAY_OF_MONTH);
calendar.add(Calendar.DATE, (-index));
return calendar.getTime();
}
/**
* 获取下一天
* @param date
* @return
*/
public static Date getNext(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DATE, 1);
return calendar.getTime();
}
/**
* 获取天
* @param date
* @return
*/
public static int getDay(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.get(Calendar.DAY_OF_MONTH);
}
/**
* 获取月
* @param date
* @return
*/
public static int getMonth(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.get(Calendar.MONTH)+1;
}
/**
* 获取时
* @param date
* @return
*/
public static int getHour(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.get(Calendar.HOUR_OF_DAY);
}
/**
* 获取分
* @param date
* @return
*/
public static int getMinute(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.get(Calendar.MINUTE);
}
/**
* 获取秒
* @param date
* @return
*/
public static int getSecond(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.get(Calendar.SECOND);
}
/**
* 获取年
* @param date
* @return
*/
public static int getYear(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.get(Calendar.YEAR);
}
/**
* 获取年
* @param date
* @return
*/
public static int getTimeMillisOfDay(Date date) throws Exception {
int year = DateTools.getYear(date);
int month = DateTools.getMonth(date);
int day = DateTools.getDay(date);
String zeorTime= DateTools.getNewDate(year,month,day,0,0,0);
long m= DateTools.ConverToDate(zeorTime).getTime();
long m1=date.getTime();
return (int)(m1-m);
}
/**
* 获取传入月份的所有日期
* @param d
* @return
*/
public static List<String> getAllDaysMonthByDate(Date d)//根据传入的日期获取所在月份所有日期
{
List<String> lst=new ArrayList<String>();
Date date = getMonthStart(d);
Date monthEnd = getMonthEnd(d);
while (!date.after(monthEnd)) {
//System.out.println(sdf.format(date));
lst.add(sdf.format(date));
date = getNext(date);
}
return lst;
}
/**
* 描述:日期转换为字都串 wang 2016年10月8日 下午3:02:20
* @param date
* @return
*/
public static String ConverToStrings(Date date) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
return df.format(date);
}
/**
* 描述:字符串转换为日期 wang 2016年10月8日 下午3:02:54
* @param strDate
* @return
* @throws Exception
*/
public static Date ConverToDate(String strDate) throws Exception {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return df.parse(strDate);
}
/**
* 描述:日期转换为字符串 wang 2016年10月8日 下午3:03:22
*
* @param date
* @param pattern
* @return
* @throws ParseException
*/
public static String ConverToString(Date date, String pattern) throws ParseException {
DateFormat format = new SimpleDateFormat(pattern);
return format.format(date);
}
/**
* 描述:字符串转换为日期 wang 2016年10月8日 下午3:04:09
*
* @param strDate
* @param pattern
* @return
* @throws ParseException
*/
public static Date ConverToDate(String strDate, String pattern) throws ParseException {
DateFormat format = new SimpleDateFormat(pattern);
return format.parse(strDate);
}
/**
* 描述:返回给定日期的后N天的日期 作者:wang
*
* @param date
* @param n
* @return 下午3:21:39
*/
public static Date getAfter(Date date, int n) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
try {
cal.setTime(format.parse(format.format(date)));
} catch (ParseException e) {
e.printStackTrace();
}
cal.add(Calendar.DATE, n);
return cal.getTime();
}
/**
* 描述:根据日期获取星期几,0-6 作者:wang
* @param dt
* @return 下午3:26:52
*/
public static int getWeekNumOfDate(Date dt) {
Calendar cal = Calendar.getInstance();
cal.setTime(dt);
int week = cal.get(Calendar.DAY_OF_WEEK) - 1;
if (week < 0) {
week = 0;
}
return week;
}
/**
* 转换为时间戳
* @param dates
* @param time
* @return
*/
public static String ConvertToTimestamp(String dates, String time) {
String dtime = "";
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Date date = df.parse(dates + " " + time);
dtime = String.valueOf(date.getTime());
} catch (ParseException e) {
e.printStackTrace();
}
return dtime;
}
/**
* 日期时区格式转换 yk
* @param datest
* @return
*/
public static String dateTimeZone(String datest) throws ParseException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS Z");
//注意是空格+UTC
Date d = format.parse(datest.replace("Z", " UTC"));
return ConverToString(d);
}
/**
* 根据年获取每个月
* @return
*/
public static List<String> getEachMonthr(Integer in) {
List<String> stringList = new ArrayList<String>();
Date d1 = null;//定义起始日期
Date d2 = null;
try {
d1 = new SimpleDateFormat("yyyy").parse(in.toString());
d2 = new SimpleDateFormat("yyyy").parse(String.valueOf(in.intValue()+1));//定义结束日期
} catch (ParseException e) {
e.printStackTrace();
}
Calendar dd = Calendar.getInstance();//定义日期实例
dd.setTime(d1);//设置日期起始时间
while (dd.getTime().before(d2)) {//判断是否到结束日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String str = sdf.format(dd.getTime());
//System.out.println(str);//输出日期结果
stringList.add(str);
dd.add(Calendar.MONTH, 1);//进行当前日期月份加1
}
return stringList;
}
public static String StringFormatDate(Date date) {
DateFormat df = new SimpleDateFormat("yyyy年MM月dd号HH:mm分");
return df.format(date);
}
//获取当天的开始时间
public static String getDayBegin() {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = new GregorianCalendar();
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return df.format(cal.getTime());
}
//获取某日期所在年的开始时间
public static String getBeginDayOfYear(Date date) {
GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
gc.setTime(date);
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, Integer.valueOf(gc.get(1)));
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DATE, 1);
return df.format(getDayStartTime(cal.getTime()));
}
//获取本年的开始时间
public static String getBeginDayOfYear() {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, getNowYear());
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DATE, 1);
return df.format(getDayStartTime(cal.getTime()));
}
//获取今年是哪一年
public static Integer getNowYear() {
Date date = new Date();
GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
gc.setTime(date);
return Integer.valueOf(gc.get(1));
}
//获取当前月是哪一月
public static int getNowMonth() {
Date date = new Date();
GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
gc.setTime(date);
return gc.get(2) + 1;
}
//获取某个日期的开始时间
public static Timestamp getDayStartTime(Date d) {
Calendar calendar = Calendar.getInstance();
if (null != d) calendar.setTime(d);
calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
calendar.set(Calendar.MILLISECOND, 0);
return new Timestamp(calendar.getTimeInMillis());
}
//获取当前月的开始时间
public static String getBeginDayOfMonth() {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar = Calendar.getInstance();
calendar.set(getNowYear(), getNowMonth() - 1, 1);
return df.format(getDayStartTime(calendar.getTime()));
}
//得到本月第一天的日期
//@Methods Name getFirstDayOfMonth
//@return Date
public static String getFirstDayOfMonth(Date date){
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Calendar cDay = Calendar.getInstance();
cDay.setTime(date);
cDay.set(Calendar.DAY_OF_MONTH, 1);
System.out.println(cDay.getTime());
return df.format(getDayStartTime(cDay.getTime()));
}
//得到本月最后一天的日期
//@Methods Name getLastDayOfMonth
//@return Date
public static Date getLastDayOfMonth(Date date){
Calendar cDay = Calendar.getInstance();
cDay.setTime(date);
cDay.set(Calendar.DAY_OF_MONTH,cDay.getActualMaximum(Calendar.DAY_OF_MONTH));
System.out.println(cDay.getTime());
return cDay.getTime();
}
/**
* 得到本季度第一天的日期
* @Methods Name getFirstDayOfQuarter
* @return Date
*/
public static Date getFirstDayOfQuarter(Date date){
Calendar cDay = Calendar.getInstance();
cDay.setTime(date);
int curMonth = cDay.get(Calendar.MONTH);
if(curMonth >= Calendar.JANUARY && curMonth <= Calendar.MARCH){
cDay.set(Calendar.MONTH, Calendar.JANUARY);
}
if(curMonth >= Calendar.APRIL && curMonth <= Calendar.JUNE){
cDay.set(Calendar.MONTH, Calendar.APRIL);
}
if (curMonth >= Calendar.JULY && curMonth <= Calendar.AUGUST){
cDay.set(Calendar.MONTH, Calendar.JULY);
}
if(curMonth >= Calendar.OCTOBER && curMonth <= Calendar.DECEMBER){
cDay.set(Calendar.MONTH,Calendar.OCTOBER);
}
cDay.set(Calendar.DAY_OF_MONTH, cDay.getActualMinimum(Calendar.DAY_OF_MONTH));
return cDay.getTime();
}
/**
* 得到本季度最后一天的日期
* @Methods Name getLastDayOfQuarter
* @return Date
*/
public static Date getLastDayOfQuarter(Date date){
Calendar cDay = Calendar.getInstance();
cDay.setTime(date);
int curMonth = cDay.get(Calendar.MONTH);
if (curMonth >= Calendar.JANUARY && curMonth <= Calendar.MARCH){
cDay.set(Calendar.MONTH, Calendar.MARCH);
}
if (curMonth >= Calendar.APRIL && curMonth <= Calendar.JUNE){
cDay.set(Calendar.MONTH, Calendar.JUNE);
}
if (curMonth >= Calendar.JULY && curMonth <= Calendar.AUGUST){
cDay.set(Calendar.MONTH, Calendar.AUGUST);
}
if (curMonth >= Calendar.OCTOBER && curMonth <= Calendar.DECEMBER){
cDay.set(Calendar.MONTH, Calendar.DECEMBER);
}
cDay.set(Calendar.DAY_OF_MONTH, cDay.getActualMaximum(Calendar.DAY_OF_MONTH));
System.out.println(cDay.getTime());
return cDay.getTime();
}
/* 获取某年第一天日期
* @param year 年份
* @return String
*/
public static String getYearFirst(int year){
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(Calendar.YEAR, year);
return ConverToStrings(calendar.getTime());
}
/* 获取某年第一天日期
* @param year 年份
* @return String
*/
public static String getYearFirst(String year){
DateFormat df = new SimpleDateFormat("yyyy");
String st = df.format(year);
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(Calendar.YEAR,Integer.valueOf(st));
return ConverToStrings(calendar.getTime());
}
/**
* 获取某年最后一天日期
* @param year 年份
* @return String
*/
public static String getYearLast(int year){
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(Calendar.YEAR, year);
calendar.roll(Calendar.DAY_OF_YEAR, -1);
return ConverToStrings(calendar.getTime());
}
/**
* 根据STRING 获取当月的开始日期
* @throws ParseException
*/
public static String getMonthStart(String st){
return ConverToStrings(getMonthStart(paraseStringToDate(st)));
}
/**
* 根据STRING 获取当月的结束日期
* @throws ParseException
*/
public static String getMonthEnd(String st){
return ConverToStrings(getMonthEnd(paraseStringToDate(st)));
}
/**
* 获取指定日期时间字符串(例如:2017-09-21 17:18:00)
* @return
*/
public static String getNewDate(int year,int month,int day,int hour,int minute,int second ) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar calendar = Calendar.getInstance();
calendar.set(year, month-1, day);
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, second);
calendar.set(Calendar.MILLISECOND, 0);
Date zero = calendar.getTime();
return df.format(zero);
}
/**
* 根据开始时间和正负的时间间隔(毫秒)获取指定日期时间字符
* @throws Exception
*/
public static String getNewDate(Date startTime,Integer interval)throws Exception{
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Long time= startTime.getTime()+interval;
Date result=new Date(time);
return df.format(result);
}
/**
* 根据当前时间获取 当前的0点
* @throws ParseException
*/
public static String getTimeZero(String st) throws Exception {
long s = ConverToDate(st).getTime()/(1000*3600*24)*(1000*3600*24)-TimeZone.getDefault().getRawOffset();
return format(s);
}
/**
* 根据当前时间获取 23点
* @throws Exception
*/
public static String getTimeTwelve(String st) throws Exception {
long s = ConverToDate(st).getTime()/(1000*3600*24)*(1000*3600*24)-TimeZone.getDefault().getRawOffset();
return format(s+24*60*60*1000-1);
}
/**
*
* @throws Exception
*/
public static String getTimeByTimeSpan(Date time,Long timeSpan) throws Exception {
long millSec=time.getTime()+timeSpan;
Date date = new Date(millSec);
return ConverToString(date) ;
}
/**
*
* @throws Exception
*/
public static String getTimeByTimeSpan(String time,Long timeSpan) throws Exception {
Date dateTime=ConverToDate(time);
long millSec=dateTime.getTime()+timeSpan;
Date date = new Date(millSec);
return ConverToString(date);
}
/**
* 两个时间之间相错几个小时
* @throws Exception
*/
public static BigDecimal getTimeDifferenceHour(String startTime,String endTime) throws Exception {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d1 = df.parse(endTime);
Date d2 = df.parse(startTime);
BigDecimal b = new BigDecimal(d1.getTime()-d2.getTime());
BigDecimal a = new BigDecimal(60*60*1000);
return b.divide(a, 2, RoundingMode.HALF_UP);
}
/**
* 根据年获取每个月
* @return
*/
public static List<String> getEachMonthLest(Integer in) {
List<String> stringList = new ArrayList<String>();
Date d1 = null;//定义起始日期
Date d2 = null;
try {
d1 = new SimpleDateFormat("yyyy").parse(in.toString());
d2 = new SimpleDateFormat("yyyy").parse(String.valueOf(in.intValue()+1));//定义结束日期
} catch (ParseException e) {
e.printStackTrace();
}
Calendar dd = Calendar.getInstance();//定义日期实例
dd.setTime(d1);//设置日期起始时间
while (dd.getTime().before(d2)) {//判断是否到结束日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String str = sdf.format(dd.getTime());
//System.out.println(str);//输出日期结果
stringList.add(getMonthEnd(str));
dd.add(Calendar.MONTH, 1);//进行当前日期月份加1
}
return stringList;
}
public static List<String> getEachDayOfMonth(Integer year,Integer month) throws Exception {
List<String> stringList = new ArrayList<String>();
Calendar dd1 = Calendar.getInstance();//定义日期实例
dd1.set(year,month-1,1);
int days= dd1.getActualMaximum(Calendar.DAY_OF_MONTH);
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
for (int day=0;day<days;day++){
String date=getNewDate(year,month-1,day+1,0,0,0);
stringList.add(df.format(ConverToDate(date)));
}
return stringList;
}
/**
* 获取两个日期之间的所有日期(yyyy-MM-dd)
* @Description TODO
* @param begin
* @param end
* @return
* @date 2017-4-1
*/
public static List<String> getBetweenDates(String begin, String end) throws Exception {
List<String> result = new ArrayList<String>();
Calendar tempStart = Calendar.getInstance();
Date startTime = DateTools.ConverToDate(begin,"yyyy-MM-dd");
Date endTime = DateTools.ConverToDate(end,"yyyy-MM-dd");
tempStart.setTime(startTime);
while(startTime.getTime()<=endTime.getTime()){
result.add(DateTools.ConverToString(tempStart.getTime(),"yyyy-MM-dd"));
tempStart.add(Calendar.DAY_OF_YEAR, 1);
startTime = tempStart.getTime();
}
return result;
}
/**
* 获取两个日期之间的所有月份(yyyy-MM-dd)
* @Description TODO
* @param minDate
* @param maxDate
* @return
* @date 2017-4-1
*/
public static List<String> getMonthBetween(String minDate, String maxDate) throws ParseException {
ArrayList<String> result = new ArrayList<String>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//格式化为年月
Calendar min = Calendar.getInstance();
Calendar max = Calendar.getInstance();
min.setTime(sdf.parse(minDate));
min.set(min.get(Calendar.YEAR), min.get(Calendar.MONTH), 1);
max.setTime(sdf.parse(maxDate));
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);
}
return result;
}
public static List<String> getYearBetween(String minDate, String maxDate) throws ParseException {
ArrayList<String> result = new ArrayList<String>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//格式化为年月
Calendar min = Calendar.getInstance();
Calendar max = Calendar.getInstance();
min.setTime(sdf.parse(minDate));
min.set(min.get(Calendar.YEAR), min.get(Calendar.MONTH), 1);
max.setTime(sdf.parse(maxDate));
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.YEAR, 1);
}
return result;
}
public static String ConverStringToString(String st) throws Exception {
return ConverToString(ConverToDate(st));
}
public static void main(String[] args) throws Exception {
String dt1 = "2018-05-05";
String dt2 = "2018-05-05";
String month1 = dt1.substring(0,dt1.lastIndexOf("-"));
String month2 = dt2.substring(0,dt2.lastIndexOf("-"));
System.out.println(month1+month2);
}
}