java中使用Joda-Time處理時間

簡介

在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)作不易著榴,如果這篇文章對你有用,請點個贊謝謝?(?ω?)?屁倔!

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末脑又,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锐借,更是在濱河造成了極大的恐慌问麸,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钞翔,死亡現(xiàn)場離奇詭異严卖,居然都是意外死亡,警方通過查閱死者的電腦和手機嗅战,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門妄田,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人驮捍,你說我怎么就攤上這事疟呐。” “怎么了东且?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵启具,是天一觀的道長。 經常有香客問我珊泳,道長鲁冯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任色查,我火速辦了婚禮薯演,結果婚禮上,老公的妹妹穿的比我還像新娘秧了。我一直安慰自己跨扮,他們只是感情好,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布验毡。 她就那樣靜靜地躺著衡创,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晶通。 梳的紋絲不亂的頭發(fā)上璃氢,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機與錄音狮辽,去河邊找鬼一也。 笑死巢寡,一個胖子當著我的面吹牛,可吹牛的內容都是我干的塘秦。 我是一名探鬼主播讼渊,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼尊剔!你這毒婦竟也來了爪幻?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤须误,失蹤者是張志新(化名)和其女友劉穎挨稿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體京痢,經...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡奶甘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了祭椰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臭家。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖方淤,靈堂內的尸體忽然破棺而出钉赁,到底是詐尸還是另有隱情,我是刑警寧澤携茂,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布你踩,位于F島的核電站,受9級特大地震影響讳苦,放射性物質發(fā)生泄漏带膜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一鸳谜、第九天 我趴在偏房一處隱蔽的房頂上張望膝藕。 院中可真熱鬧,春花似錦咐扭、人聲如沸束莫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至策严,卻和暖如春穗慕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妻导。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工逛绵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留怀各,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓术浪,卻偏偏與公主長得像瓢对,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子胰苏,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內容