java實現的日期時間轉換工具類完整示例

 更新時間:2019年10月26日 12:54:42   作者:九月木子   我要評論
這篇文章主要介紹了java實現的日期時間轉換工具類,結合完整實例形式分析了java針對日期時間常見的轉換、計算、格式化等相關操作與封裝技巧,需要的朋友可以參考下

本文實例講述了java實現的日期時間轉換工具類。分享給大家供大家參考,具體如下:

最基礎的東西,總結一下,下次用的時候就方便一些了。廢話不多說,直接貼代碼:

package com.incar.base.util;
import com.incar.base.exception.BaseRuntimeException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
import java.time.temporal.WeekFields;
import java.util.*;
/**
 * Created by Administrator on 2017/4/11.
 */
public class DateUtil {
 public final static String DATE_FORMAT_DAY = "yyyy-MM-dd";
 public final static String DATE_FORMAT_SECOND = "yyyy-MM-dd HH:mm:ss";
 private final static int[] DATE_UNIT_ARR = new int[]{Calendar.MILLISECOND, Calendar.SECOND, Calendar.MINUTE, Calendar.HOUR_OF_DAY,
   Calendar.DATE, Calendar.MONTH, Calendar.YEAR};
 public static Calendar calendar = null;
 public static DateFormat dateFormat = null;
 public static Date date = null;
 /**
  * 將日期轉為 字符串
  * @param date
  * @param format
  * @return
  */
 public static String dateToString(Date date, String format) {
  if (date == null) {
   return null;
  }
  return new SimpleDateFormat(format).format(date);
 }
 /**
  * 將日期轉換為 字符串(轉換的時間按照當前登錄用戶的時區)
  *
  * @param date
  * @param format
  * @param timeZone
  * @return
  */
 public static String dateToString(Date date, String format, String timeZone) {
  if (date == null) {
   return null;
  }
  //1、格式化日期
  return getTimeZoneSimpleDateFormat(format, timeZone).format(date);
 }
 /**
  * 獲取當前登錄用戶的 日期格式化對象
  *
  * @param timeZone
  * @param format
  * @return
  */
 private static SimpleDateFormat getTimeZoneSimpleDateFormat(String format, String timeZone) {
  //1、獲取對應時區的格式化器
  SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
  simpleDateFormat.setTimeZone(TimeZone.getTimeZone(timeZone));
  return simpleDateFormat;
 }
 /**
  *將字符串轉為日期(轉換的時間按照當前登錄用戶的時區)
  * @param dateStr
  * @param format
  * @return
  */
 public static Date stringToDate(String dateStr, String format, String timeZone) {
  if (dateStr == null || format == null) {
   return null;
  }
  try {
   return getTimeZoneSimpleDateFormat(format, timeZone).parse(dateStr);
  } catch (ParseException e) {
   throw BaseRuntimeException.getException(e);
  }
 }
 /**
  *將字符串轉為日期
  * @param dateStr
  * @param format
  * @return
  */
 public static Date stringToDate_CTT(String dateStr, String format) {
  if (dateStr == null || format == null) {
   return null;
  }
  try {
   return getTimeZoneSimpleDateFormat(format, "CTT").parse(dateStr);
  } catch (ParseException e) {
   throw BaseRuntimeException.getException(e);
  }
 }
 /**
  * 獲取最近在當前日期之前的最后一個日期單位
  *
  * @param date
  * @param calendarUnit 只支持 DateUtil.DATE_UNIT_ARR
  * @return
  */
 public static Date getFloorDate(Date date, int calendarUnit) {
  if (date == null) {
   return null;
  }
  Calendar calendar = Calendar.getInstance();
  calendar.setTime(date);
  for (int i = 0; i <= DATE_UNIT_ARR.length - 1; i++) {
   if (DATE_UNIT_ARR[i] > calendarUnit) {
    if (Calendar.DATE == DATE_UNIT_ARR[i]) {
     calendar.set(DATE_UNIT_ARR[i], 1);
    } else {
     calendar.set(DATE_UNIT_ARR[i], 0);
    }
   }
   if (DATE_UNIT_ARR[i] == calendarUnit) {
    break;
   }
  }
  return calendar.getTime();
 }
 /**
  * 獲取最近在當前日期之后的第一個日期單位
  *
  * @param date
  * @param calendarUnit 只支持 DateUtil.DATE_UNIT_ARR
  * @return
  */
 public static Date getCeilDate(Date date, int calendarUnit) {
  if (date == null) {
   return null;
  }
  Calendar calendar = Calendar.getInstance();
  calendar.setTime(date);
  for (int i = 0; i <= DATE_UNIT_ARR.length - 1; i++) {
   if (DATE_UNIT_ARR[i] > calendarUnit) {
    if (Calendar.DATE == DATE_UNIT_ARR[i]) {
     calendar.set(DATE_UNIT_ARR[i], 1);
    } else {
     calendar.set(DATE_UNIT_ARR[i], 0);
    }
   }
   if (DATE_UNIT_ARR[i] == calendarUnit) {
    calendar.add(DATE_UNIT_ARR[i], 1);
    break;
   }
  }
  return calendar.getTime();
 }
 /**
  * 將開始時間、結束時間 根據日期單位劃分成 時間段
  *
  *
  * @param startDate
  * @param endDate
  * @param calendarUnit Calendar.MONTH,Calendar.DATE
  * @param dateNum  指定的單位日期數量
  * @return 每一個數組第一個為開始時間,第二個為結束時間; 第一個元素結束時間總是等于第二元素開始時間
  */
 public static List<Date[]> splitDate(Date startDate, Date endDate, int calendarUnit, int dateNum) {
  List<Date[]> returnList = new ArrayList<>();
  if (startDate.getTime() > endDate.getTime()) {
   return null;
  }
  Calendar c1 = Calendar.getInstance();
  Calendar c2 = Calendar.getInstance();
  c1.setTime(startDate);
  c2.setTime(endDate);
  Calendar curC1 = Calendar.getInstance();
  Calendar curC2 = null;
  curC1.setTime(startDate);
  while (curC2 == null || curC2.before(c2)) {
   if (curC2 == null) {
    curC2 = Calendar.getInstance();
    curC2.setTime(startDate);
    curC2.add(calendarUnit, dateNum);
   } else {
    curC1.add(calendarUnit, dateNum);
    curC2.add(calendarUnit, dateNum);
   }
   returnList.add(new Date[]{curC1.getTime(), curC2.getTime()});
  }
  //設置最后一個區間的截至日期為endDate
  returnList.get(returnList.size() - 1)[1] = endDate;
  return returnList;
 }
 /**
  * 獲取開始時間結束時間按照 日期單位 形成多個日期區間
  * 分割出來的時間區間以
  * 第一個區間開始時間為傳入開始時間
  * 最后一個區間結束時間為傳入結束時間
  * @param startDate
  * @param endDate
  * @param unit 1:代表按日;2:代表按周;3:代表按月
  * @return
  */
 public static List<Date[]> rangeDate(Date startDate, Date endDate, int unit){
  List<Date[]> returnList=new ArrayList<>();
  LocalDateTime ldt1= LocalDateTime.ofInstant(startDate.toInstant(),ZoneId.of("+8"));
  LocalDateTime ldt2= LocalDateTime.ofInstant(endDate.toInstant(),ZoneId.of("+8"));
  switch (unit){
   case 1:{
    LocalDateTime start= ldt1.with(ChronoField.SECOND_OF_DAY,0);
    LocalDateTime end= ldt1.with(ChronoField.SECOND_OF_DAY, ChronoUnit.DAYS.getDuration().getSeconds()-1);
    while(true){
     returnList.add(new Date[]{Date.from(start.toInstant(ZoneOffset.of("+8"))),Date.from(end.toInstant(ZoneOffset.of("+8")))});
     if(!ldt2.isBefore(start)&&!ldt2.isAfter(end)){
      break;
     }else{
      start=start.plusDays(1);
      end=end.plusDays(1);
     }
    }
    break;
   }
   case 2:{
    int dayOfWeek=ldt1.get(ChronoField.DAY_OF_WEEK);
    LocalDateTime start= ldt1.plusDays(1-dayOfWeek).with(ChronoField.SECOND_OF_DAY,0);
    LocalDateTime end= ldt1.plusDays(7-dayOfWeek).with(ChronoField.SECOND_OF_DAY, ChronoUnit.DAYS.getDuration().getSeconds()-1);
    while(true){
     returnList.add(new Date[]{Date.from(start.toInstant(ZoneOffset.of("+8"))),Date.from(end.toInstant(ZoneOffset.of("+8")))});
     if(!ldt2.isBefore(start)&&!ldt2.isAfter(end)){
      break;
     }else{
      start=start.plusWeeks(1);
      end=end.plusWeeks(1);
     }
    }
    if(returnList.size()>0){
     Date[] firstEle=returnList.get(0);
     Date[] lastEle=returnList.get(returnList.size()-1);
     firstEle[0]=Date.from(ldt1.with(ChronoField.SECOND_OF_DAY,0).toInstant(ZoneOffset.of("+8")));
     lastEle[1]=Date.from(ldt2.with(ChronoField.SECOND_OF_DAY,0).toInstant(ZoneOffset.of("+8")));
    }
    break;
   }
   case 3:{
    LocalDateTime temp=ldt1;
    while(true) {
     int dayOfMonth = temp.get(ChronoField.DAY_OF_MONTH);
     int max = temp.getMonth().maxLength();
     LocalDateTime start = temp.plusDays(1 - dayOfMonth).with(ChronoField.SECOND_OF_DAY, 0);
     LocalDateTime end = temp.plusDays(max - dayOfMonth).with(ChronoField.SECOND_OF_DAY, ChronoUnit.DAYS.getDuration().getSeconds() - 1);
     returnList.add(new Date[]{Date.from(start.toInstant(ZoneOffset.of("+8"))),Date.from(end.toInstant(ZoneOffset.of("+8")))});
     if(!ldt2.isBefore(start)&&!ldt2.isAfter(end)){
      break;
     }else{
      temp=temp.plusMonths(1);
     }
    }
    if(returnList.size()>0){
     Date[] firstEle=returnList.get(0);
     Date[] lastEle=returnList.get(returnList.size()-1);
     firstEle[0]=Date.from(ldt1.with(ChronoField.SECOND_OF_DAY,0).toInstant(ZoneOffset.of("+8")));
     lastEle[1]=Date.from(ldt2.with(ChronoField.SECOND_OF_DAY,0).toInstant(ZoneOffset.of("+8")));
    }
    break;
   }
  }
  return returnList;
 }
 /**
  * 計算兩個時間相差多少日期單位(不足一個日期單位的的按一個日期單位算)
  *
  * @param d1 開始時間
  * @param d2 結束時間
  * @return 相差日期單位數
  */
 public static int getDiff(Date d1, Date d2, int calendarUnit) {
  double diff;
  switch (calendarUnit) {
   case Calendar.DATE: {
    diff = 1000 * 60 * 60 * 24;
    break;
   }
   case Calendar.HOUR_OF_DAY: {
    diff = 1000 * 60 * 60;
    break;
   }
   case Calendar.MINUTE: {
    diff = 1000 * 60;
    break;
   }
   case Calendar.SECOND: {
    diff = 1000;
    break;
   }
   default: {
    throw BaseRuntimeException.getException("[DateUtil.getDiff],Calendar Unit Not Support!");
   }
  }
  Long begin = d1.getTime();
  Long end = d2.getTime();
  Double res = (end - begin) / diff;
  return (int) Math.ceil(res);
 }
 /**
  * 會改變參數值
  * 格式化日期參數開始日期和結束日期
  * 格式規則為:
  * 開始日期去掉時分秒
  * 結束日期設置為當天 23:59:59
  *
  * @param startDate
  * @param endDate
  */
 public static void formatDateParam(Date startDate, Date endDate) {
  if (startDate != null) {
   startDate.setTime(getFloorDate(startDate, Calendar.DATE).getTime());
  }
  if (endDate != null) {
   Date tempDate = getCeilDate(endDate, Calendar.DATE);
   Calendar endC = Calendar.getInstance();
   endC.setTime(tempDate);
   endC.add(Calendar.SECOND, -1);
   endDate.setTime(endC.getTimeInMillis());
  }
 }
 /**
  * 獲取一個日期的數字表示形式
  * 例如:
  * 2018-3-12 15:13:12 888 表示成 20180312151312888
  *
  * @param date
  * @param calendarUnit 最小的日期單位
  * @return
  */
 public static Long getDateNum(Date date, int calendarUnit) {
  if (date == null) {
   return null;
  }
  StringBuffer sb = new StringBuffer();
  Calendar c = Calendar.getInstance();
  c.setTime(date);
  if (calendarUnit >= Calendar.YEAR) {
   sb.append(c.get(Calendar.YEAR));
  }
  if (calendarUnit >= Calendar.MONTH) {
   sb.append(FormatUtil.formatToString(c.get(Calendar.MONTH) + 1, "00"));
  }
  if (calendarUnit >= Calendar.DATE) {
   sb.append(FormatUtil.formatToString(c.get(Calendar.DATE), "00"));
  }
  if (calendarUnit >= Calendar.HOUR_OF_DAY) {
   sb.append(FormatUtil.formatToString(c.get(Calendar.HOUR_OF_DAY), "00"));
  }
  if (calendarUnit >= Calendar.MINUTE) {
   sb.append(FormatUtil.formatToString(c.get(Calendar.MINUTE), "00"));
  }
  if (calendarUnit >= Calendar.SECOND) {
   sb.append(FormatUtil.formatToString(c.get(Calendar.SECOND), "00"));
  }
  if (calendarUnit >= Calendar.MILLISECOND) {
   sb.append(FormatUtil.formatToString(c.get(Calendar.MILLISECOND), "000"));
  }
  return Long.parseLong(sb.toString());
 }
 /**
  * 判斷兩個日期是否相等
  *
  * @param d1
  * @param d2
  * @param calendarUnit 對比的最小日期單位
  * @return
  */
 public static boolean isEqual(Date d1, Date d2, int calendarUnit) {
  Calendar c1 = Calendar.getInstance();
  Calendar c2 = Calendar.getInstance();
  c1.setTime(d1);
  c2.setTime(d2);
  for (int i = DATE_UNIT_ARR.length - 1; i >= 0; i--) {
   if (calendarUnit >= DATE_UNIT_ARR[i]) {
    int v1 = c1.get(DATE_UNIT_ARR[i]);
    int v2 = c2.get(DATE_UNIT_ARR[i]);
    if (v1 != v2) {
     return false;
    }
   } else {
    break;
   }
  }
  return true;
 }
 /**
  * 獲取當天初始時間
  *
  * @param date 時間
  * @return 初始時間 (yyyy-MM-dd 00:00:00)
  */
 public static Date getInitialTime(Date date) {
  DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
  String dateStr = dateFormat.format(date);
  try {
   return dateFormat.parse(dateStr);
  } catch (ParseException e) {
   e.printStackTrace();
  }
  return null;
 }
 /**
  * 獲取當天最后時間
  *
  * @param date 時間
  * @return 最后時間 (yyyy-MM-dd 23:59:59)
  */
 public static Date getTerminalTime(Date date) {
  DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
  String dateStr = dateFormat.format(date);
  dateStr = dateStr + " 23:59:59";
  dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  try {
   return dateFormat.parse(dateStr);
  } catch (ParseException e) {
   e.printStackTrace();
  }
  return null;
 }
 public static String date2Str(Date date) {
  DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  return dateFormat.format(date);
 }
 /**
  * 計算兩個時間間隔多少秒
  *
  * @param startDate
  * @param endDate
  * @return
  */
 public static Long intervalTime(Date startDate, Date endDate) {
  long a = endDate.getTime();
  long b = startDate.getTime();
  Long c = ((a - b) / 1000);
  return c;
 }
 /**
  * 檢測一個日期是否在 小時之內,支持跨天的小時
  *
  * @param time
  * @param startDate
  * @param endDate
  * @return
  */
 public static boolean checkDateIn(Date time, Date startDate, Date endDate) {
  if (startDate == null || endDate == null || time == null) {
   return true;
  }
  return time.before(endDate) && time.after(startDate);
 }
 /**
  * 檢測一個日期是否在 時分秒 之內,支持跨天的小時
  *
  * @param time
  * @param startHms
  * @param endHms
  * @return
  */
 public static boolean checkHmsIn(Date time, String startHms, String endHms) {
  if (startHms == null || endHms == null || time == null) {
   return true;
  }
  LocalTime startTime = LocalTime.of(
    Integer.valueOf(startHms.substring(0, 2)),
    Integer.valueOf(startHms.substring(2, 4)),
    Integer.valueOf(startHms.substring(4, 6))
  );
  LocalTime endTime = LocalTime.of(
    Integer.valueOf(endHms.substring(0, 2)),
    Integer.valueOf(endHms.substring(2, 4)),
    Integer.valueOf(endHms.substring(4, 6))
  );
  LocalTime curTime = LocalDateTime.ofInstant(time.toInstant(), ZoneId.of("+8")).toLocalTime();
  if (endTime.isAfter(startTime)) {
   return startTime.isBefore(curTime) && endTime.isAfter(curTime);
  } else {
   return (startTime.isBefore(curTime) && LocalTime.MAX.isAfter(curTime)) || (LocalTime.MIN.isBefore(curTime) && endTime.isAfter(curTime));
  }
 }
 /**
  * 功能描述:格式化日期
  *
  * @param dateStr 字符型日期:YYYY/MM/DD 格式
  * @return Date 日期
  */
 public static Date parseDate(String dateStr) {
  return parseDate(dateStr, "yyyy-MM-dd");
 }
 /**
  * 功能描述:格式化日期
  *
  * @param dateStr 字符型日期
  * @param format 格式
  * @return Date 日期
  */
 public static Date parseDate(String dateStr, String format) {
  try {
   dateFormat = new SimpleDateFormat(format);
   String dt = dateStr.replaceAll("-", "/");
   if ((!dt.equals("")) && (dt.length() < format.length())) {
    dt += format.substring(dt.length()).replaceAll("[YyMmDdHhSs]",
      "0");
   }
   date = (Date) dateFormat.parse(dt);
  } catch (Exception e) {
   return null;
  }
  return date;
 }
 public static Date stringParseDate(String date) throws ParseException {
  //獲取的值為"19570323"
  //1、定義轉換格式
  SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
  SimpleDateFormat formatter2 = new SimpleDateFormat("yyyyMMdd");
  //2、調用formatter2.parse(),將"19570323"轉化為date類型 輸出為:Sat Mar 23 00:00:00 GMT+08:00 1957
  Date parseDate = formatter2.parse(date);
  return parseDate;
 }
}

PS:這里再為大家推薦幾款關于日期與時間計算的在線工具供大家參考使用:

在線日期/天數計算器:
http://tools.jb51.net/jisuanqi/date_jisuanqi

在線萬年歷日歷:
http://tools.jb51.net/bianmin/wannianli

在線陰歷/陽歷轉換工具:
http://tools.jb51.net/bianmin/yinli2yangli

Unix時間戳(timestamp)轉換工具:
http://tools.jb51.net/code/unixtime

更多關于java相關內容感興趣的讀者可查看本站專題:《java日期與時間操作技巧匯總》、《Java數據結構與算法教程》、《Java操作DOM節點技巧總結》和《Java緩存操作技巧匯總

希望本文所述對大家java程序設計有所幫助。

相關文章

  • Java 8 開發的 Mybatis 注解代碼生成工具

    Java 8 開發的 Mybatis 注解代碼生成工具

    MybatisAnnotationTools 是基于 Java8 開發的一款可以用于自動化生成 MyBatis 注解類的工具,支持配置數據源、類路徑,表名去前綴、指定類名前后綴等功能.這篇文章主要介紹了Java 8 開發的 Mybatis 注解代碼生成工具 ,需要的朋友可以參考下
    2019-07-07
  • java面向對象的三大特性之一繼承用法實例分析

    java面向對象的三大特性之一繼承用法實例分析

    這篇文章主要介紹了java面向對象的三大特性之一繼承用法,結合實例形式分析了java面向對象程序設計中繼承的基本原理與具體使用方法,需要的朋友可以參考下
    2019-11-11
  • Java并發之條件阻塞Condition的應用代碼示例

    Java并發之條件阻塞Condition的應用代碼示例

    這篇文章主要介紹了Java并發之條件阻塞Condition的應用代碼示例,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • Spring Cloud如何使用Feign構造多參數的請求

    Spring Cloud如何使用Feign構造多參數的請求

    這篇文章主要介紹了Spring Cloud如何使用Feign構造多參數的請求,以GET以及POST方法的請求為例進行講解,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • SpringBoot + Spring Security 基本使用及個性化登錄配置詳解

    SpringBoot + Spring Security 基本使用及個性化登錄配置詳解

    這篇文章主要介紹了SpringBoot + Spring Security 基本使用及個性化登錄配置詳解,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Spring與Spring boot的區別介紹

    Spring與Spring boot的區別介紹

    Spring Boot框架的核心就是自動配置,只要存在相應的jar包,Spring就幫我們自動配置。接下來通過本文給大家介紹Spring與Spring boot的區別介紹,非常不錯,需要的朋友參考下吧
    2017-04-04
  • java為移動端寫接口開發實例

    java為移動端寫接口開發實例

    本篇文章主要介紹了java如何為移動端寫接口,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Java的正則表達式深入分析

    Java的正則表達式深入分析

    本篇文章介紹了,Java的正則表達式深入分析。需要的朋友參考下
    2013-04-04
  • 詳解SpringBoot定時任務說明

    詳解SpringBoot定時任務說明

    本篇文章主要介紹了詳解SpringBoot定時任務說明,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Java編程long數據類型的使用問題

    Java編程long數據類型的使用問題

    這篇文章主要介紹了Java編程數據類型long的使用問題,涉及長整型數據的取值范圍和不同整數類型的表示方法,需要的朋友可以參考下
    2017-09-09

最新評論

福建体育彩票时时彩11