簡介
在Java中處理日期和時間是很常見的需求,基礎的工具類就是我們熟悉的Date和Calendar绰上,然而這些工具類的api使用并不是很方便和強大垢袱,于是就誕生了Joda-Time這個專門處理日期時間的庫。
核心類
使用最多的五個日期時間類:
- Instant - 不可變的類袜香,用來表示時間軸上一個瞬時的點(時間戳)
- DateTime - 不可變的類吃谣,用來替換JDK的Calendar類
LocalDate - 不可變的類襟诸,表示一個本地的日期,而不包含時間部分(沒有時區(qū)信息)
- LocalTime - 不可變的類基协,表示一個本地的時間,而不包含日期部分(沒有時區(qū)信息)
- LocalDateTime - 不可變的類衷旅,表示一個本地的日期-時間(沒有時區(qū)信息)
maven配置:
<!-- 日期工具欄依賴 -->
<dependency>
? ? <groupId>joda-time</groupId>
? ? <artifactId>joda-time</artifactId>
? ? <version>2.9.4</version>
</dependency>
工具類提供:
package com.macro.mall.tiny.demo.utils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.joda.time.DateTime;
/**
* @author zhangtonghao
* @create 2022-09-05 16:00
*/
public class JodaTimeUtils {
? ? public static String getThisWeekEndTime() {
? ? ? ? DateTime now = DateTime.now();
? ? ? ? now = now.withDayOfWeek(7)
? ? ? ? ? ? ? ? .withHourOfDay(23)
? ? ? ? ? ? ? ? .withMinuteOfHour(59)
? ? ? ? ? ? ? ? .withSecondOfMinute(59);
? ? ? ? //本周日
? ? ? ? return DateFormatUtils.format(now.toDate(),? "yyyy-MM-dd HH:mm:ss");
? ? }
? ? public static String getThisWeekStartTime() {
? ? ? ? DateTime now = DateTime.now();
? ? ? ? now = now.withDayOfWeek(1)
? ? ? ? ? ? ? ? .withHourOfDay(0)
? ? ? ? ? ? ? ? .withMinuteOfHour(0)
? ? ? ? ? ? ? ? .withSecondOfMinute(0);
? ? ? ? //本周1
? ? ? ? return DateFormatUtils.format(now.toDate(),? "yyyy-MM-dd HH:mm:ss");
? ? }
? ? public static String getThisDayStartTime() {
? ? ? ? DateTime now = DateTime.now();
? ? ? ? now = now.millisOfDay()
? ? ? ? ? ? ? ? .withMinimumValue();
? ? ? ? //今天
? ? ? ? return DateFormatUtils.format(now.toDate(),? "yyyy-MM-dd HH:mm:ss");
? ? }
? ? public static String getThisDayEndTime() {
? ? ? ? DateTime now = DateTime.now();
? ? ? ? now = now.millisOfDay()
? ? ? ? ? ? ? ? .withMaximumValue();
? ? ? ? //今天
? ? ? ? return DateFormatUtils.format(now.toDate(),? "yyyy-MM-dd HH:mm:ss");
? ? }
? ? public static String getThisMonthStartTime() {
? ? ? ? DateTime now = DateTime.now();
? ? ? ? now = now.dayOfMonth().withMinimumValue()
? ? ? ? ? ? ? ? .withHourOfDay(0)
? ? ? ? ? ? ? ? .withMinuteOfHour(0)
? ? ? ? ? ? ? ? .withSecondOfMinute(0);
? ? ? ? //本月初
? ? ? ? return DateFormatUtils.format(now.toDate(),? "yyyy-MM-dd HH:mm:ss");
? ? }
? ? public static String getThisMonthEndTime() {
? ? ? ? DateTime now = DateTime.now();
? ? ? ? now = now.dayOfMonth().withMaximumValue()
? ? ? ? ? ? ? ? .withHourOfDay(23)
? ? ? ? ? ? ? ? .withMinuteOfHour(59)
? ? ? ? ? ? ? ? .withSecondOfMinute(59);
? ? ? ? //本月末
? ? ? ? return DateFormatUtils.format(now.toDate(),? "yyyy-MM-dd HH:mm:ss");
? ? }
? ? // i 0 本月1上一個月 類推
? ? public static String getMonthStartTime(int i) {
? ? ? ? DateTime now = DateTime.now();
? ? ? ? now = now.minusMonths(i).dayOfMonth().withMinimumValue()
? ? ? ? ? ? ? ? .withHourOfDay(0)
? ? ? ? ? ? ? ? .withMinuteOfHour(0)
? ? ? ? ? ? ? ? .withSecondOfMinute(0);
? ? ? ? //本月初
? ? ? ? return DateFormatUtils.format(now.toDate(),? "yyyy-MM-dd HH:mm:ss");
? ? }
? ? public static String getMonthEndTime(int i) {
? ? ? ? DateTime now = DateTime.now();
? ? ? ? now = now.minusMonths(i).dayOfMonth().withMaximumValue()
? ? ? ? ? ? ? ? .withHourOfDay(23)
? ? ? ? ? ? ? ? .withMinuteOfHour(59)
? ? ? ? ? ? ? ? .withSecondOfMinute(59);
? ? ? ? //本月末
? ? ? ? return DateFormatUtils.format(now.toDate(),? "yyyy-MM-dd HH:mm:ss");
? ? }
}
拓展使用:
with開頭的方法(比如:withYear):用來設置DateTime實例的某個時間救恨。因為DateTime是不可變對象蔫缸,所以沒有提供setter方法可供使用,with方法也沒有改變原有的對象杂穷,而是返回了設置后的一個副本對象。
plus/minus開頭的方法(比如:plusDay, minusMonths):用來返回在DateTime實例上增加或減少一段時間后的實例卦绣。
返回Property的方法:Property是DateTime中的屬性耐量,保存了一些有用的信息。
DateTime dt = new DateTime(2000, 11, 27, 0, 0, 0);
System.out.println(dt);
dt = dt.withYear(2017);// 設置年份為2017
System.out.println(dt);
時間獲嚷烁邸:
DateTime dt = new DateTime(2000, 11, 27, 0, 0, 0);
System.out.println(dt);
dt = dt.withYear(2017); // 設置年份為2017
System.out.println(dt);
int year = dt.getYear();// 年
int month = dt.getMonthOfYear();// 月
int day = dt.getDayOfMonth();// 日
int hour = dt.getHourOfDay();// 小時
int minute = dt.getMinuteOfHour();// 分鐘
int second = dt.getSecondOfMinute();// 秒
int millis = dt.getMillisOfSecond();// 毫秒
System.out.println(year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second + ":" + millis);
String month2 = dt.monthOfYear().getAsText();
String day2 = dt.dayOfWeek().getAsShortText();
String day3 = dt.dayOfWeek().getAsShortText(Locale.CHINESE); // 以指定格式獲取
System.out.println(month2);
System.out.println(day2);
System.out.println(day3);
時間計算:
dt = dt.plusDays(1);// 加一天
dt = dt.plusHours(1);// 加一小時
dt = dt.plusYears(-1);// 減一年
System.out.println(dt.toString("yyyy-MM-dd HH:mm:ss"));
dt = dt.minusYears(1);// 減一年
dt = dt.minusMinutes(-30);// 加半個小時
System.out.println(dt.toString("yyyy-MM-dd HH:mm:ss"));
與jdk互操作:
Date date = dt.toDate();
Calendar calendar = dt.toCalendar(Locale.CHINESE);
// 某些屬性進行置0操作廊蜒。比如趴拧,我想得到當天的0點時刻。
DateTime now = new DateTime();
now.dayOfWeek().roundCeilingCopy();
now.dayOfWeek().roundFloorCopy();
now.minuteOfDay().roundFloorCopy();
now.secondOfMinute().roundFloorCopy();
其它:還有許多其它方法(比如dateTime.year().isLeap()來判斷是不是閏年)山叮。
工具類累加(最好先看懂上面相關的使用方法以及函數(shù))
private static final String PATTERN_STANDARD = "yyyy-MM-dd HH:mm:ss";
private static final String PATTERN_DATE = "yyyy-MM-dd";
private static final String PATTERN_TIME = "HH:mm:ss";
/**
* date類型 -> string類型
*
* @param date
* @return
*/
public static String date2Str(Date date) {
? ? if (date == null) {
? ? ? ? return "";
? ? }
? ? DateTime dateTime = new DateTime(date);
? ? return dateTime.toString(PATTERN_STANDARD);
}
/**
* date類型 -> string類型
*
* @param date
* @param formatPattern
* @return
*/
public static String date2Str(Date date, String formatPattern) {
? ? if (date == null) {
? ? ? ? return "";
? ? }
? ? DateTime dateTime = new DateTime(date);
? ? return dateTime.toString(formatPattern);
}
/**
* string類型 -> date類型
*
* @param timeStr
* @return
*/
public static Date str2Date(String timeStr) {
? ? DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern(PATTERN_STANDARD);
? ? DateTime dateTime = dateTimeFormatter.parseDateTime(timeStr);
? ? return dateTime.toDate();
}
/**
* 獲取指定時間
* @param year 年
* @param month 月
* @param day 日
* @param hour 時
* @param minute 分
* @param seconds 秒
* @return yyyy-MM-dd HH:mm:ss
*/
public static String getAssignedDateTime(Integer year, Integer month, Integer day, Integer hour, Integer minute, Integer seconds) {
? ? DateTime dt = new DateTime(year, month, day, hour, minute, seconds);
? ? String date = dt.toString(PATTERN_STANDARD);
? ? return date;
}
/**
* 獲取指定日期
* @param year
* @param month
* @param day
* @return
*/
public static String getAssignedDate(Integer year, Integer month, Integer day) {
? ? LocalDate dt = new LocalDate(year, month, day);
? ? String date = dt.toString(PATTERN_DATE);
? ? return date;
}
/**
* 獲取指定時間
* @param hour
* @param minutes
* @param seconds
* @return
*/
public static String getAssignedTime(Integer hour, Integer minutes, Integer seconds) {
? ? LocalTime dt = new LocalTime(hour, minutes, seconds);
? ? String date = dt.toString(PATTERN_TIME);
? ? return date;
}
/**
* 判斷date日期是否過期(與當前時刻比較)
*
* @param date
* @return
*/
public static boolean isTimeExpired(Date date) {
? ? if (null == date) {
? ? ? ? return true;
? ? }
? ? String timeStr = date2Str(date);
? ? return isBeforeNow(timeStr);
}
/**
* 判斷date日期是否過期(與當前時刻比較)
*
* @param timeStr
* @return
*/
public static boolean isTimeExpired(String timeStr) {
? ? if (StringUtils.isBlank(timeStr)) {
? ? ? ? return true;
? ? }
? ? return isBeforeNow(timeStr);
}
/**
* 判斷timeStr是否在當前時刻之前
*
* @param timeStr
* @return
*/
private static boolean isBeforeNow(String timeStr) {
? ? DateTimeFormatter format = DateTimeFormat.forPattern(PATTERN_STANDARD);
? ? DateTime dateTime = DateTime.parse(timeStr, format);
? ? return dateTime.isBeforeNow();
}
/**
* 加天數(shù)
*
* @param date
* @param days
* @return
*/
private static Date plusDays(Date date, Integer days) {
? ? if (null == date) {
? ? ? ? return null;
? ? }
? ? days = null == days ? 0 : days;
? ? DateTime dateTime = new DateTime(date);
? ? dateTime = dateTime.plusDays(days);
? ? return dateTime.toDate();
}
/**
* 減天數(shù)
*
* @param date
* @param days
* @return
*/
private static Date minusDays(Date date, Integer days) {
? ? if (null == date) {
? ? ? ? return null;
? ? }
? ? days = null == days ? 0 : days;
? ? DateTime dateTime = new DateTime(date);
? ? dateTime = dateTime.minusDays(days);
? ? return dateTime.toDate();
}
/**
* 加分鐘
*
* @param date
* @param minutes
* @return
*/
private static Date plusMinutes(Date date, Integer minutes) {
? ? if (null == date) {
? ? ? ? return null;
? ? }
? ? minutes = null == minutes ? 0 : minutes;
? ? DateTime dateTime = new DateTime(date);
? ? dateTime = dateTime.plusMinutes(minutes);
? ? return dateTime.toDate();
}
/**
* 減分鐘
*
* @param date
* @param minutes
* @return
*/
private static Date minusMinutes(Date date, Integer minutes) {
? ? if (null == date) {
? ? ? ? return null;
? ? }
? ? minutes = null == minutes ? 0 : minutes;
? ? DateTime dateTime = new DateTime(date);
? ? dateTime = dateTime.minusMinutes(minutes);
? ? return dateTime.toDate();
}
/**
* 加月份
*
* @param date
* @param months
* @return
*/
private static Date plusMonths(Date date, Integer months) {
? ? if (null == date) {
? ? ? ? return null;
? ? }
? ? months = null == months ? 0 : months;
? ? DateTime dateTime = new DateTime(date);
? ? dateTime = dateTime.plusMonths(months);
? ? return dateTime.toDate();
}
/**
* 減月份
*
* @param date
* @param months
* @return
*/
private static Date minusMonths(Date date, Integer months) {
? ? if (null == date) {
? ? ? ? return null;
? ? }
? ? months = null == months ? 0 : months;
? ? DateTime dateTime = new DateTime(date);
? ? dateTime = dateTime.minusMonths(months);
? ? return dateTime.toDate();
}
/**
* 判斷target是否在開始和結束時間之間
*
* @param target
* @param startTime
* @param endTime
* @return
*/
public static boolean isBetween(Date target, Date startTime, Date endTime) {
? ? if (null == target || null == startTime || null == endTime) {
? ? ? ? return false;
? ? }
? ? DateTime dateTime = new DateTime(target);
? ? return dateTime.isAfter(startTime.getTime()) && dateTime.isBefore(endTime.getTime());
}
/**
* 獲取當前系統(tǒng)時間
* @return yyyy-MM-dd HH:mm:ss
*/
public static String getCurrentDateTime() {
? ? DateTime dt = new DateTime();
? ? String time = dt.toString(PATTERN_STANDARD);
? ? return time;
}
/**
* 獲取當前日期
* @return
*/
public static String getCurrentDate() {
? ? DateTime dt = new DateTime();
? ? String date = dt.toString(PATTERN_DATE);
? ? return date;
}
/**
* 獲取系統(tǒng)當前時間按照指定格式返回
* @return
*/
public static String getCurrentTime() {
? ? DateTime dt = new DateTime();
? ? String time = dt.toString(PATTERN_TIME);
? ? return time;
}
/**
* 獲取當前是一周星期幾
* @return
*/
public static String getWeek() {
? ? DateTime dts = new DateTime();
? ? String week = null;
? ? switch (dts.getDayOfWeek()) {
? ? ? ? case DateTimeConstants.SUNDAY:
? ? ? ? ? ? week = "星期日";
? ? ? ? ? ? break;
? ? ? ? case DateTimeConstants.MONDAY:
? ? ? ? ? ? week = "星期一";
? ? ? ? ? ? break;
? ? ? ? case DateTimeConstants.TUESDAY:
? ? ? ? ? ? week = "星期二";
? ? ? ? ? ? break;
? ? ? ? case DateTimeConstants.WEDNESDAY:
? ? ? ? ? ? week = "星期三";
? ? ? ? ? ? break;
? ? ? ? case DateTimeConstants.THURSDAY:
? ? ? ? ? ? week = "星期四";
? ? ? ? ? ? break;
? ? ? ? case DateTimeConstants.FRIDAY:
? ? ? ? ? ? week = "星期五";
? ? ? ? ? ? break;
? ? ? ? case DateTimeConstants.SATURDAY:
? ? ? ? ? ? week = "星期六";
? ? ? ? default:
? ? ? ? ? ? break;
? ? }
? ? return week;
}
/**
* 獲取指定時間是一周的星期幾
* @param year
* @param month
* @param day
* @return
*/
public static String getWeek(Integer year, Integer month, Integer day) {
? ? LocalDate dts = new LocalDate(year, month, day);
? ? String week = null;
? ? switch (dts.getDayOfWeek()) {
? ? ? ? case DateTimeConstants.SUNDAY:
? ? ? ? ? ? week = "星期日";
? ? ? ? ? ? break;
? ? ? ? case DateTimeConstants.MONDAY:
? ? ? ? ? ? week = "星期一";
? ? ? ? ? ? break;
? ? ? ? case DateTimeConstants.TUESDAY:
? ? ? ? ? ? week = "星期二";
? ? ? ? ? ? break;
? ? ? ? case DateTimeConstants.WEDNESDAY:
? ? ? ? ? ? week = "星期三";
? ? ? ? ? ? break;
? ? ? ? case DateTimeConstants.THURSDAY:
? ? ? ? ? ? week = "星期四";
? ? ? ? ? ? break;
? ? ? ? case DateTimeConstants.FRIDAY:
? ? ? ? ? ? week = "星期五";
? ? ? ? ? ? break;
? ? ? ? case DateTimeConstants.SATURDAY:
? ? ? ? ? ? week = "星期六";
? ? ? ? ? ? break;
? ? ? ? default:
? ? ? ? ? ? break;
? ? }
? ? return week;
}
/**
* 計算兩個時間相差多少天
* @param startDate
* @param endDate
* @return
*/
public static Integer diffDay(Date startDate, Date endDate) {
? ? if (startDate == null || endDate == null) {
? ? ? ? return null;
? ? }
? ? DateTime dt1 = new DateTime(startDate);
? ? DateTime dt2 = new DateTime(endDate);
? ? int day = Days.daysBetween(dt1, dt2).getDays();
? ? return Math.abs(day);
}
創(chuàng)作不易著榴,如果這篇文章對你有用,請點個贊謝謝?(?ω?)?屁倔!