Java中joda日期格式化工具的使用示例
1.基本介紹
Java自帶日期格式化工具DateFormat ,但是DateFormat 的所有實(shí)現(xiàn),包括 SimpleDateFormat 都不是線程安全的,因此你不應(yīng)該在多線程序中使用,除非是在對外線程安全的環(huán)境中使用,如 將 SimpleDateFormat 限制在 ThreadLocal 中。如果你不這么做,在解析或者格式化日期的時候,可能會獲取到一個不正確的結(jié)果。因此,從日期、時間處理的所有實(shí)踐來說,我強(qiáng)力推薦使用joda-time 庫。
2.joda-time的使用
引入依賴
<dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.10.5</version> </dependency>
編寫測試類
public class DateUtils {
public static final long SECOND = 1000; // 1秒 java已毫秒為單位
public static final long MINUTE = SECOND * 60; // 一分鐘
public static final long HOUR = MINUTE * 60; // 一小時
public static final long DAY = HOUR * 24; // 一天
public static final long WEEK = DAY * 7; // 一周
public static final long YEAR = DAY * 365; // 一年
public static final String FORMAT_TIME = "yyyy-MM-dd HH:mm:ss"; // 默認(rèn)時間格式
public static final String FORMAT_TIME_MINUTE = "yyyy-MM-dd HH:mm"; // 默認(rèn)時間格式
public static final String FORTER_DATE = "yyyy-MM-dd"; // 默認(rèn)日期格式
private static final Map<Integer, String> WEEK_DAY = new HashMap<Integer, String>();
static {
WEEK_DAY.put(7, "星期六");
WEEK_DAY.put(1, "星期天");
WEEK_DAY.put(2, "星期一");
WEEK_DAY.put(3, "星期二");
WEEK_DAY.put(4, "星期三");
WEEK_DAY.put(5, "星期四");
WEEK_DAY.put(6, "星期五");
}
/**
* 獲取當(dāng)前系統(tǒng)時間
*
* @return yyyy-MM-dd HH:mm:ss
*/
public static String getCurrentTime() {
DateTime dt = new DateTime();
String time = dt.toString(FORMAT_TIME);
return time;
}
/**
* 獲取系統(tǒng)當(dāng)前時間按照指定格式返回
*
* @param pattern
* yyyy/MM/dd hh:mm:a
* @return
*/
public static String getCurrentTimePattern(String pattern) {
DateTime dt = new DateTime();
String time = dt.toString(pattern);
return time;
}
/**
* 獲取當(dāng)前日期
*
* @return
*/
public static String getCurrentDate() {
DateTime dt = new DateTime();
String date = dt.toString(FORTER_DATE);
return date;
}
/**
* 獲取當(dāng)前日期按照指定格式
*
* @param pattern
* @return
*/
public static String getCurrentDatePattern(String pattern) {
DateTime dt = new DateTime();
String date = dt.toString(pattern);
return date;
}
/**
* 按照時區(qū)轉(zhuǎn)換時間
*
* @param date
* @param timeZone
* 時區(qū)
* @param parrten
* @return
*/
@Nullable
public static String format(Date date, TimeZone timeZone, String parrten) {
if (date == null) {
return null;
}
SimpleDateFormat sdf = new SimpleDateFormat(parrten);
sdf.setTimeZone(timeZone);
return sdf.format(date);
}
/**
* 獲取指定時間
*
* @param year
* 年
* @param month
* 月
* @param day
* 天
* @param hour
* 小時
* @param minute
* 分鐘
* @param seconds
* 秒
* @return yyyy-MM-dd HH:mm:ss
*/
public static String getPointTime(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(FORMAT_TIME);
return date;
}
/**
*
* @param year
* 年
* @param month
* 月
* @param day
* 天
* @param hour
* 小時
* @param minute
* 分鐘
* @param seconds
* 秒
* @param parrten
* 自定義格式
* @return parrten
*/
public static String getPointTimePattern(Integer year, Integer month, Integer day, Integer hour, Integer minute,
Integer seconds, String parrten) {
DateTime dt = new DateTime(year, month, day, hour, minute, seconds);
String date = dt.toString(parrten);
return date;
}
/**
* 獲取指定日期
*
* @param year
* @param month
* @param day
* @return
*/
public static String getPointDate(Integer year, Integer month, Integer day) {
LocalDate dt = new LocalDate(year, month, day);
String date = dt.toString(FORTER_DATE);
return date;
}
/**
* 獲取指定日期 返回指定格式
*
* @param year
* @param month
* @param day
* @param parrten
* @return
*/
public static String getPointDatParrten(Integer year, Integer month, Integer day, String parrten) {
LocalDate dt = new LocalDate(year, month, day);
String date = dt.toString(parrten);
return date;
}
/**
* 獲取當(dāng)前是一周星期幾
*
* @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 getWeekPoint(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 date
* @return yyyy-MM-dd HH:mm:ss
*/
@Nullable
public static String format(Date date) {
if (date == null) {
return null;
}
SimpleDateFormat format = new SimpleDateFormat(FORMAT_TIME);
return format.format(date);
}
/**
* 格式化日期字符串
*
* @param date
* 日期
* @param pattern
* 日期格式
* @return
*/
@Nullable
public static String format(Date date, String pattern) {
if (date == null) {
return null;
}
SimpleDateFormat format = new SimpleDateFormat(pattern);
return format.format(date);
}
/**
* 解析日期
*
* @param date
* 日期字符串
* @param pattern
* 日期格式
* @return
*/
@Nullable
public static Date parse(String date, String pattern) {
if (date == null) {
return null;
}
Date resultDate = null;
try {
resultDate = new SimpleDateFormat(pattern).parse(date);
} catch (ParseException e) {
}
return resultDate;
}
/**
* 解析日期yyyy-MM-dd HH:mm:ss
*
* @param date
* 日期字符串
* @return
*/
@Nullable
public static Date parse(String date) {
if (date == null) {
return null;
}
try {
return new SimpleDateFormat(FORMAT_TIME).parse(date);
} catch (ParseException e) {
return null;
}
}
/**
* 解析日期 yyyy-MM-dd HH:mm:ss
*
* @param timestamp
* @return
*/
public static String format(Long timestamp, String pattern) {
String dateStr = "";
if (null == timestamp || timestamp.longValue() < 0) {
return dateStr;
}
try {
Date date = new Date(timestamp);
SimpleDateFormat format = new SimpleDateFormat(pattern);
dateStr = format.format(date);
} catch (Exception e) {
// ignore
}
return dateStr;
}
/**
* 解析日期 yyyy-MM-dd HH:mm:ss
*
* @param timestamp
* @return
*/
public static String format(Long timestamp) {
String dateStr = "";
if (null == timestamp || timestamp.longValue() < 0) {
return dateStr;
}
try {
Date date = new Date(timestamp);
SimpleDateFormat format = new SimpleDateFormat(FORMAT_TIME);
dateStr = format.format(date);
} catch (Exception e) {
// ignore
}
return dateStr;
}
/**
* 獲取當(dāng)前時間前幾天時間,按指定格式返回
*
* @param days
* @return
*/
public static String forwardDay(Integer days, String format) {
DateTime dt = new DateTime();
DateTime y = dt.minusDays(days);
return y.toString(format);
}
/**
* 獲取當(dāng)前時間前幾天時間
*
* @param days
* @return
*/
public static Date forwardDay(Integer days) {
DateTime dt = new DateTime();
DateTime y = dt.minusDays(days);
return y.toDate();
}
/**
* 獲取指定時間之后或者之前的某一天00:00:00 默認(rèn)返回當(dāng)天
*
* @param days
* @return
*/
public static Date day00(Integer days, String date, String zimeZone) throws Throwable {
DateTime dt;
TimeZone timeZone;
try {
if (isBlank(zimeZone)) {
timeZone = TimeZone.getDefault();
} else {
timeZone = TimeZone.getTimeZone(zimeZone);
}
if (isBlank(date)) {
dt = new DateTime().withZone(DateTimeZone.forTimeZone(timeZone)).toLocalDateTime().toDateTime();
} else {
dt = new DateTime(date).withZone(DateTimeZone.forTimeZone(timeZone)).toLocalDateTime().toDateTime();
}
} catch (Exception e) {
throw new Throwable(e);
}
DateTime y = dt.minusDays(days).withHourOfDay(0).withMinuteOfHour(0).withSecondOfMinute(0);
return y.toDate();
}
/**
* 獲取指定時間之后或者之前的某一天23:59:59 默認(rèn)返回當(dāng)天
*
* @param days
* 偏移量
* @return
*/
public static Date day59(Integer days, String date, String zimeZone) throws Throwable {
DateTime dt;
TimeZone timeZone;
try {
if (isBlank(zimeZone)) {
timeZone = TimeZone.getDefault();
} else {
timeZone = TimeZone.getTimeZone(zimeZone);
}
if (isBlank(date)) {
dt = new DateTime().withZone(DateTimeZone.forTimeZone(timeZone)).toLocalDateTime().toDateTime();
} else {
dt = new DateTime(date).withZone(DateTimeZone.forTimeZone(timeZone)).toLocalDateTime().toDateTime();
}
} catch (Exception e) {
throw new Throwable(e);
}
DateTime y = dt.minusDays(days).withHourOfDay(23).withMinuteOfHour(59).withSecondOfMinute(59);
return y.toDate();
}
/**
* 計(jì)算兩個時間相差多少天
*
* @param startDate
* @param endDate
* @return
*/
@Nullable
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);
}
/**
* 獲取某月之前,之后某一個月最后一天,24:59:59
*
* @return
*/
public static Date lastDay(Date date, Integer month) {
DateTime dt1;
if (month == null) {
month = 0;
}
if (date == null) {
dt1 = new DateTime().minusMonths(month);
} else {
dt1 = new DateTime(date).minusMonths(month);
}
DateTime lastDay = dt1.dayOfMonth().withMaximumValue().withHourOfDay(23).withMinuteOfHour(59)
.withSecondOfMinute(59);
return lastDay.toDate();
}
/**
* 獲取某月月之前,之后某一個月第一天,00:00:00
*
* @return
*/
public static Date firstDay(Date date, Integer month) {
DateTime dt1;
if (month == null) {
month = 0;
}
if (date == null) {
dt1 = new DateTime().minusMonths(month);
} else {
dt1 = new DateTime(date).minusMonths(month);
}
DateTime lastDay = dt1.dayOfMonth().withMinimumValue().withHourOfDay(0).withMinuteOfHour(0)
.withSecondOfMinute(0);
return lastDay.toDate();
}
public static Date addDay(Date date, int offset) {
DateTime dt1;
if (date == null) {
dt1 = new DateTime().plusDays(offset);
return dt1.toDate();
}
dt1 = new DateTime(date).plusDays(offset);
return dt1.toDate();
}
/**
* 傳入日期時間與當(dāng)前系統(tǒng)日期時間的比較, 若日期相同,則根據(jù)時分秒來返回 , 否則返回具體日期
*
* @return 日期或者 xx小時前||xx分鐘前||xx秒前
*/
@Nullable
public static String getNewUpdateDateString(Date now, Date createDate) {
if (now == null || createDate == null) {
return null;
}
Long time = (now.getTime() - createDate.getTime());
if (time > (24 * 60 * 60 * 1000)) {
return time / (24 * 60 * 60 * 1000) + "天前";
} else if (time > (60 * 60 * 1000)) {
return time / (60 * 60 * 1000) + "小時前";
} else if (time > (60 * 1000)) {
return time / (60 * 1000) + "分鐘前";
} else if (time >= 1000) {
return time / 1000 + "秒前";
}
return "剛剛";
}
/**
*
* @Title: isBlank
* @Description: TODO(判斷字符串是否為空或長度為0 或由空格組成)
* @param @param str
* @param @return 設(shè)定文件
* @return boolean 返回類型
* @throws
*/
public static boolean isBlank(String str) {
return (str == null || str.trim().length() == 0);
}
public static void main(String[] args) throws Throwable {
System.out.println(lastDay(new Date(),2));
System.out.println(firstDay(null,0));
TimeZone zone1=TimeZone.getTimeZone("GMT+8");
TimeZone zone2=TimeZone.getTimeZone("GMT-5");
System.out.println(format(new Date(),zone1,FORMAT_TIME));
System.out.println(format(new Date(),zone2,FORMAT_TIME));
System.out.println(format(day00(0,"2017-5-11","GMT+0")));
System.out.println(format(day00(0,"2017-5-11","GMT+8")));
System.out.println(format(day00(0,"2017-5-11","GMT-8")));
Date date1 =parse("2017-05-11 17:53:52");
System.out.println(diffDay(date1,new Date()));
DateTime dateTime = new DateTime().withDayOfWeek(1);
DateTime dateTime1 = new DateTime().withDayOfWeek(7).withTime(0, 0,
0, 0);
System.out.println(format(dateTime.toDate()));
System.out.println(format(dateTime1.toDate()));
System.out.println(format(new Date(), "MM/dd"));
}
}
優(yōu)點(diǎn)
1. 易于使用:Calendar讓獲取"正常的"的日期變得很困難,使它沒辦法提供簡單的方法,而Joda-Time能夠 直接進(jìn)行訪問域并且索引值1就是代表January。
2. 易于擴(kuò)展:JDK支持多日歷系統(tǒng)是通過Calendar的子類來實(shí)現(xiàn),這樣就顯示的非常笨重而且事實(shí) 上要實(shí)現(xiàn)其它日歷系統(tǒng)是很困難的。Joda-Time支持多日歷系統(tǒng)是通過基于Chronology類的插件體系來實(shí)現(xiàn)。
3. 提供一組完整的功能:它打算提供 所有關(guān)系到date-time計(jì)算的功能.Joda-Time當(dāng)前支持8種日歷系統(tǒng),而且在將來還會繼續(xù)添加,有著比JDK Calendar更好的整體性能等等。
以上就是Java中joda日期格式化工具的使用示例的詳細(xì)內(nèi)容,更多關(guān)于java 日期格式化工具的資料請關(guān)注腳本之家其它相關(guān)文章!
- Java日期格式化如何避免YYYY引發(fā)的時間異常
- Java技能點(diǎn)之SimpleDateFormat進(jìn)行日期格式化問題
- java日期格式化YYYY-MM-dd遇坑指南小結(jié)
- java中日期格式化的大坑
- Golang中使用Date進(jìn)行日期格式化(沿用Java風(fēng)格)
- Java中日期格式化YYYY-DD的操作bug
- 與眾不同的 Java 日期格式化大全
- java日期格式化SimpleDateFormat的使用詳解
- java正則實(shí)現(xiàn)各種日期格式化
- Java日期格式化的實(shí)現(xiàn)(@JsonFormat和@JSONField)
相關(guān)文章
java使用jacob.jar將word轉(zhuǎn)pdf
這篇文章主要為大家詳細(xì)介紹了java利用jacob.jar將word轉(zhuǎn)pdf,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12
Java接口自動化測試框架設(shè)計(jì)之Get請求方法和測試詳解
這篇文章主要介紹了Java接口自動化測試框架設(shè)計(jì) Get請求方法和測試,框架設(shè)計(jì)我們只是介紹基本的組件,而且框架設(shè)計(jì)沒有想象那么難,一步一步跟著做就會了。這篇我們來演示,如果通過Java代碼來實(shí)現(xiàn)一個用純代碼實(shí)現(xiàn)Http中的Get請求過程,需要的朋友可以參考下2019-07-07
Mybatis批量插入index out of range錯誤的解決(較偏的錯誤)
這篇文章主要介紹了Mybatis批量插入index out of range錯誤的解決(較偏的錯誤),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
springboot單文件下載和多文件壓縮zip下載的實(shí)現(xiàn)
這篇文章主要介紹了springboot單文件下載和多文件壓縮zip下載的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
SpringBoot?SpringSecurity?JWT實(shí)現(xiàn)系統(tǒng)安全策略詳解
Spring?Security是Spring的一個核心項(xiàng)目,它是一個功能強(qiáng)大且高度可定制的認(rèn)證和訪問控制框架。它提供了認(rèn)證和授權(quán)功能以及抵御常見的攻擊,它已經(jīng)成為保護(hù)基于spring的應(yīng)用程序的事實(shí)標(biāo)準(zhǔn)2022-11-11

