您的位置:首页 > 编程语言 > Java开发

java日期工具类DateUtil

2016-12-28 20:19 489 查看
DateUtil类

[java] view plain copy

package com.itkt.mtravel.hotel.util;

import java.text.ParsePosition;

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.Calendar;

import java.util.Date;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

public class DateUtil {

private static final ThreadLocal<SimpleDateFormat> threadLocal = new ThreadLocal<SimpleDateFormat>();

private static final Object object = new Object();

/**

* 获取SimpleDateFormat

* @param pattern 日期格式

* @return SimpleDateFormat对象

* @throws RuntimeException 异常:非法日期格式

*/

private static SimpleDateFormat getDateFormat(String pattern) throws RuntimeException {

SimpleDateFormat dateFormat = threadLocal.get();

if (dateFormat == null) {

synchronized (object) {

if (dateFormat == null) {

dateFormat = new SimpleDateFormat(pattern);

dateFormat.setLenient(false);

threadLocal.set(dateFormat);

}

}

}

dateFormat.applyPattern(pattern);

return dateFormat;

}

/**

* 获取日期中的某数值。如获取月份

* @param date 日期

* @param dateType 日期格式

* @return 数值

*/

private static int getInteger(Date date, int dateType) {

int num = 0;

Calendar calendar = Calendar.getInstance();

if (date != null) {

calendar.setTime(date);

num = calendar.get(dateType);

}

return num;

}

/**

* 增加日期中某类型的某数值。如增加日期

* @param date 日期字符串

* @param dateType 类型

* @param amount 数值

* @return 计算后日期字符串

*/

private static String addInteger(String date, int dateType, int amount) {

String dateString = null;

DateStyle dateStyle = getDateStyle(date);

if (dateStyle != null) {

Date myDate = StringToDate(date, dateStyle);

myDate = addInteger(myDate, dateType, amount);

dateString = DateToString(myDate, dateStyle);

}

return dateString;

}

/**

* 增加日期中某类型的某数值。如增加日期

* @param date 日期

* @param dateType 类型

* @param amount 数值

* @return 计算后日期

*/

private static Date addInteger(Date date, int dateType, int amount) {

Date myDate = null;

if (date != null) {

Calendar calendar = Calendar.getInstance();

calendar.setTime(date);

calendar.add(dateType, amount);

myDate = calendar.getTime();

}

return myDate;

}

/**

* 获取精确的日期

* @param timestamps 时间long集合

* @return 日期

*/

private static Date getAccurateDate(List<Long> timestamps) {

Date date = null;

long timestamp = 0;

Map<Long, long[]> map = new HashMap<Long, long[]>();

List<Long> absoluteValues = new ArrayList<Long>();

if (timestamps != null && timestamps.size() > 0) {

if (timestamps.size() > 1) {

for (int i = 0; i < timestamps.size(); i++) {

for (int j = i + 1; j < timestamps.size(); j++) {

long absoluteValue = Math.abs(timestamps.get(i) - timestamps.get(j));

absoluteValues.add(absoluteValue);

long[] timestampTmp = { timestamps.get(i), timestamps.get(j) };

map.put(absoluteValue, timestampTmp);

}

}

// 有可能有相等的情况。如2012-11和2012-11-01。时间戳是相等的。此时minAbsoluteValue为0

// 因此不能将minAbsoluteValue取默认值0

long minAbsoluteValue = -1;

if (!absoluteValues.isEmpty()) {

minAbsoluteValue = absoluteValues.get(0);

for (int i = 1; i < absoluteValues.size(); i++) {

if (minAbsoluteValue > absoluteValues.get(i)) {

minAbsoluteValue = absoluteValues.get(i);

}

}

}

if (minAbsoluteValue != -1) {

long[] timestampsLastTmp = map.get(minAbsoluteValue);

long dateOne = timestampsLastTmp[0];

long dateTwo = timestampsLastTmp[1];

if (absoluteValues.size() > 1) {

timestamp = Math.abs(dateOne) > Math.abs(dateTwo) ? dateOne : dateTwo;

}

}

} else {

timestamp = timestamps.get(0);

}

}

if (timestamp != 0) {

date = new Date(timestamp);

}

return date;

}

/**

* 判断字符串是否为日期字符串

* @param date 日期字符串

* @return true or false

*/

public static boolean isDate(String date) {

boolean isDate = false;

if (date != null) {

if (getDateStyle(date) != null) {

isDate = true;

}

}

return isDate;

}

/**

* 获取日期字符串的日期风格。失敗返回null。

* @param date 日期字符串

* @return 日期风格

*/

public static DateStyle getDateStyle(String date) {

DateStyle dateStyle = null;

Map<Long, DateStyle> map = new HashMap<Long, DateStyle>();

List<Long> timestamps = new ArrayList<Long>();

for (DateStyle style : DateStyle.values()) {

if (style.isShowOnly()) {

continue;

}

Date dateTmp = null;

if (date != null) {

try {

ParsePosition pos = new ParsePosition(0);

dateTmp = getDateFormat(style.getValue()).parse(date, pos);

if (pos.getIndex() != date.length()) {

dateTmp = null;

}

} catch (Exception e) {

}

}

if (dateTmp != null) {

timestamps.add(dateTmp.getTime());

map.put(dateTmp.getTime(), style);

}

}

Date accurateDate = getAccurateDate(timestamps);

if (accurateDate != null) {

dateStyle = map.get(accurateDate.getTime());

}

return dateStyle;

}

/**

* 将日期字符串转化为日期。失败返回null。

* @param date 日期字符串

* @return 日期

*/

public static Date StringToDate(String date) {

DateStyle dateStyle = getDateStyle(date);

return StringToDate(date, dateStyle);

}

/**

* 将日期字符串转化为日期。失败返回null。

* @param date 日期字符串

* @param pattern 日期格式

* @return 日期

*/

public static Date StringToDate(String date, String pattern) {

Date myDate = null;

if (date != null) {

try {

myDate = getDateFormat(pattern).parse(date);

} catch (Exception e) {

}

}

return myDate;

}

/**

* 将日期字符串转化为日期。失败返回null。

* @param date 日期字符串

* @param dateStyle 日期风格

* @return 日期

*/

public static Date StringToDate(String date, DateStyle dateStyle) {

Date myDate = null;

if (dateStyle != null) {

myDate = StringToDate(date, dateStyle.getValue());

}

return myDate;

}

/**

* 将日期转化为日期字符串。失败返回null。

* @param date 日期

* @param pattern 日期格式

* @return 日期字符串

*/

public static String DateToString(Date date, String pattern) {

String dateString = null;

if (date != null) {

try {

dateString = getDateFormat(pattern).format(date);

} catch (Exception e) {

}

}

return dateString;

}

/**

* 将日期转化为日期字符串。失败返回null。

* @param date 日期

* @param dateStyle 日期风格

* @return 日期字符串

*/

public static String DateToString(Date date, DateStyle dateStyle) {

String dateString = null;

if (dateStyle != null) {

dateString = DateToString(date, dateStyle.getValue());

}

return dateString;

}

/**

* 将日期字符串转化为另一日期字符串。失败返回null。

* @param date 旧日期字符串

* @param newPattern 新日期格式

* @return 新日期字符串

*/

public static String StringToString(String date, String newPattern) {

DateStyle oldDateStyle = getDateStyle(date);

return StringToString(date, oldDateStyle, newPattern);

}

/**

* 将日期字符串转化为另一日期字符串。失败返回null。

* @param date 旧日期字符串

* @param newDateStyle 新日期风格

* @return 新日期字符串

*/

public static String StringToString(String date, DateStyle newDateStyle) {

DateStyle oldDateStyle = getDateStyle(date);

return StringToString(date, oldDateStyle, newDateStyle);

}

/**

* 将日期字符串转化为另一日期字符串。失败返回null。

* @param date 旧日期字符串

* @param olddPattern 旧日期格式

* @param newPattern 新日期格式

* @return 新日期字符串

*/

public static String StringToString(String date, String olddPattern, String newPattern) {

return DateToString(StringToDate(date, olddPattern), newPattern);

}

/**

* 将日期字符串转化为另一日期字符串。失败返回null。

* @param date 旧日期字符串

* @param olddDteStyle 旧日期风格

* @param newParttern 新日期格式

* @return 新日期字符串

*/

public static String StringToString(String date, DateStyle olddDteStyle, String newParttern) {

String dateString = null;

if (olddDteStyle != null) {

dateString = StringToString(date, olddDteStyle.getValue(), newParttern);

}

return dateString;

}

/**

* 将日期字符串转化为另一日期字符串。失败返回null。

* @param date 旧日期字符串

* @param olddPattern 旧日期格式

* @param newDateStyle 新日期风格

* @return 新日期字符串

*/

public static String StringToString(String date, String olddPattern, DateStyle newDateStyle) {

String dateString = null;

if (newDateStyle != null) {

dateString = StringToString(date, olddPattern, newDateStyle.getValue());

}

return dateString;

}

/**

* 将日期字符串转化为另一日期字符串。失败返回null。

* @param date 旧日期字符串

* @param olddDteStyle 旧日期风格

* @param newDateStyle 新日期风格

* @return 新日期字符串

*/

public static String StringToString(String date, DateStyle olddDteStyle, DateStyle newDateStyle) {

String dateString = null;

if (olddDteStyle != null && newDateStyle != null) {

dateString = StringToString(date, olddDteStyle.getValue(), newDateStyle.getValue());

}

return dateString;

}

/**

* 增加日期的年份。失败返回null。

* @param date 日期

* @param yearAmount 增加数量。可为负数

* @return 增加年份后的日期字符串

*/

public static String addYear(String date, int yearAmount) {

return addInteger(date, Calendar.YEAR, yearAmount);

}

/**

* 增加日期的年份。失败返回null。

* @param date 日期

* @param yearAmount 增加数量。可为负数

* @return 增加年份后的日期

*/

public static Date addYear(Date date, int yearAmount) {

return addInteger(date, Calendar.YEAR, yearAmount);

}

/**

* 增加日期的月份。失败返回null。

* @param date 日期

* @param monthAmount 增加数量。可为负数

* @return 增加月份后的日期字符串

*/

public static String addMonth(String date, int monthAmount) {

return addInteger(date, Calendar.MONTH, monthAmount);

}

/**

* 增加日期的月份。失败返回null。

* @param date 日期

* @param monthAmount 增加数量。可为负数

* @return 增加月份后的日期

*/

public static Date addMonth(Date date, int monthAmount) {

return addInteger(date, Calendar.MONTH, monthAmount);

}

/**

* 增加日期的天数。失败返回null。

* @param date 日期字符串

* @param dayAmount 增加数量。可为负数

* @return 增加天数后的日期字符串

*/

public static String addDay(String date, int dayAmount) {

return addInteger(date, Calendar.DATE, dayAmount);

}

/**

* 增加日期的天数。失败返回null。

* @param date 日期

* @param dayAmount 增加数量。可为负数

* @return 增加天数后的日期

*/

public static Date addDay(Date date, int dayAmount) {

return addInteger(date, Calendar.DATE, dayAmount);

}

/**

* 增加日期的小时。失败返回null。

* @param date 日期字符串

* @param hourAmount 增加数量。可为负数

* @return 增加小时后的日期字符串

*/

public static String addHour(String date, int hourAmount) {

return addInteger(date, Calendar.HOUR_OF_DAY, hourAmount);

}

/**

* 增加日期的小时。失败返回null。

* @param date 日期

* @param hourAmount 增加数量。可为负数

* @return 增加小时后的日期

*/

public static Date addHour(Date date, int hourAmount) {

return addInteger(date, Calendar.HOUR_OF_DAY, hourAmount);

}

/**

* 增加日期的分钟。失败返回null。

* @param date 日期字符串

* @param minuteAmount 增加数量。可为负数

* @return 增加分钟后的日期字符串

*/

public static String addMinute(String date, int minuteAmount) {

return addInteger(date, Calendar.MINUTE, minuteAmount);

}

/**

* 增加日期的分钟。失败返回null。

* @param date 日期

* @param dayAmount 增加数量。可为负数

* @return 增加分钟后的日期

*/

public static Date addMinute(Date date, int minuteAmount) {

return addInteger(date, Calendar.MINUTE, minuteAmount);

}

/**

* 增加日期的秒钟。失败返回null。

* @param date 日期字符串

* @param dayAmount 增加数量。可为负数

* @return 增加秒钟后的日期字符串

*/

public static String addSecond(String date, int secondAmount) {

return addInteger(date, Calendar.SECOND, secondAmount);

}

/**

* 增加日期的秒钟。失败返回null。

* @param date 日期

* @param dayAmount 增加数量。可为负数

* @return 增加秒钟后的日期

*/

public static Date addSecond(Date date, int secondAmount) {

return addInteger(date, Calendar.SECOND, secondAmount);

}

/**

* 获取日期的年份。失败返回0。

* @param date 日期字符串

* @return 年份

*/

public static int getYear(String date) {

return getYear(StringToDate(date));

}

/**

* 获取日期的年份。失败返回0。

* @param date 日期

* @return 年份

*/

public static int getYear(Date date) {

return getInteger(date, Calendar.YEAR);

}

/**

* 获取日期的月份。失败返回0。

* @param date 日期字符串

* @return 月份

*/

public static int getMonth(String date) {

return getMonth(StringToDate(date));

}

/**

* 获取日期的月份。失败返回0。

* @param date 日期

* @return 月份

*/

public static int getMonth(Date date) {

return getInteger(date, Calendar.MONTH) + 1;

}

/**

* 获取日期的天数。失败返回0。

* @param date 日期字符串

* @return 天

*/

public static int getDay(String date) {

return getDay(StringToDate(date));

}

/**

* 获取日期的天数。失败返回0。

* @param date 日期

* @return 天

*/

public static int getDay(Date date) {

return getInteger(date, Calendar.DATE);

}

/**

* 获取日期的小时。失败返回0。

* @param date 日期字符串

* @return 小时

*/

public static int getHour(String date) {

return getHour(StringToDate(date));

}

/**

* 获取日期的小时。失败返回0。

* @param date 日期

* @return 小时

*/

public static int getHour(Date date) {

return getInteger(date, Calendar.HOUR_OF_DAY);

}

/**

* 获取日期的分钟。失败返回0。

* @param date 日期字符串

* @return 分钟

*/

public static int getMinute(String date) {

return getMinute(StringToDate(date));

}

/**

* 获取日期的分钟。失败返回0。

* @param date 日期

* @return 分钟

*/

public static int getMinute(Date date) {

return getInteger(date, Calendar.MINUTE);

}

/**

* 获取日期的秒钟。失败返回0。

* @param date 日期字符串

* @return 秒钟

*/

public static int getSecond(String date) {

return getSecond(StringToDate(date));

}

/**

* 获取日期的秒钟。失败返回0。

* @param date 日期

* @return 秒钟

*/

public static int getSecond(Date date) {

return getInteger(date, Calendar.SECOND);

}

/**

* 获取日期 。默认yyyy-MM-dd格式。失败返回null。

* @param date 日期字符串

* @return 日期

*/

public static String getDate(String date) {

return StringToString(date, DateStyle.YYYY_MM_DD);

}

/**

* 获取日期。默认yyyy-MM-dd格式。失败返回null。

* @param date 日期

* @return 日期

*/

public static String getDate(Date date) {

return DateToString(date, DateStyle.YYYY_MM_DD);

}

/**

* 获取日期的时间。默认HH:mm:ss格式。失败返回null。

* @param date 日期字符串

* @return 时间

*/

public static String getTime(String date) {

return StringToString(date, DateStyle.HH_MM_SS);

}

/**

* 获取日期的时间。默认HH:mm:ss格式。失败返回null。

* @param date 日期

* @return 时间

*/

public static String getTime(Date date) {

return DateToString(date, DateStyle.HH_MM_SS);

}

/**

* 获取日期的星期。失败返回null。

* @param date 日期字符串

* @return 星期

*/

public static Week getWeek(String date) {

Week week = null;

DateStyle dateStyle = getDateStyle(date);

if (dateStyle != null) {

Date myDate = StringToDate(date, dateStyle);

week = getWeek(myDate);

}

return week;

}

/**

* 获取日期的星期。失败返回null。

* @param date 日期

* @return 星期

*/

public static Week getWeek(Date date) {

Week week = null;

Calendar calendar = Calendar.getInstance();

calendar.setTime(date);

int weekNumber = calendar.get(Calendar.DAY_OF_WEEK) - 1;

switch (weekNumber) {

case 0:

week = Week.SUNDAY;

break;

case 1:

week = Week.MONDAY;

break;

case 2:

week = Week.TUESDAY;

break;

case 3:

week = Week.WEDNESDAY;

break;

case 4:

week = Week.THURSDAY;

break;

case 5:

week = Week.FRIDAY;

break;

case 6:

week = Week.SATURDAY;

break;

}

return week;

}

/**

* 获取两个日期相差的天数

* @param date 日期字符串

* @param otherDate 另一个日期字符串

* @return 相差天数。如果失败则返回-1

*/

public static int getIntervalDays(String date, String otherDate) {

return getIntervalDays(StringToDate(date), StringToDate(otherDate));

}

/**

* @param date 日期

* @param otherDate 另一个日期

* @return 相差天数。如果失败则返回-1

*/

public static int getIntervalDays(Date date, Date otherDate) {

int num = -1;

Date dateTmp = DateUtil.StringToDate(DateUtil.getDate(date), DateStyle.YYYY_MM_DD);

Date otherDateTmp = DateUtil.StringToDate(DateUtil.getDate(otherDate), DateStyle.YYYY_MM_DD);

if (dateTmp != null && otherDateTmp != null) {

long time = Math.abs(dateTmp.getTime() - otherDateTmp.getTime());

num = (int) (time / (24 * 60 * 60 * 1000));

}

return num;

}

}

DateStyle类

[java] view plain copy

package com.itkt.mtravel.hotel.util;

public enum DateStyle {

YYYY_MM("yyyy-MM", false),

YYYY_MM_DD("yyyy-MM-dd", false),

YYYY_MM_DD_HH_MM("yyyy-MM-dd HH:mm", false),

YYYY_MM_DD_HH_MM_SS("yyyy-MM-dd HH:mm:ss", false),

YYYY_MM_EN("yyyy/MM", false),

YYYY_MM_DD_EN("yyyy/MM/dd", false),

YYYY_MM_DD_HH_MM_EN("yyyy/MM/dd HH:mm", false),

YYYY_MM_DD_HH_MM_SS_EN("yyyy/MM/dd HH:mm:ss", false),

YYYY_MM_CN("yyyy年MM月", false),

YYYY_MM_DD_CN("yyyy年MM月dd日", false),

YYYY_MM_DD_HH_MM_CN("yyyy年MM月dd日 HH:mm", false),

YYYY_MM_DD_HH_MM_SS_CN("yyyy年MM月dd日 HH:mm:ss", false),

HH_MM("HH:mm", true),

HH_MM_SS("HH:mm:ss", true),

MM_DD("MM-dd", true),

MM_DD_HH_MM("MM-dd HH:mm", true),

MM_DD_HH_MM_SS("MM-dd HH:mm:ss", true),

MM_DD_EN("MM/dd", true),

MM_DD_HH_MM_EN("MM/dd HH:mm", true),

MM_DD_HH_MM_SS_EN("MM/dd HH:mm:ss", true),

MM_DD_CN("MM月dd日", true),

MM_DD_HH_MM_CN("MM月dd日 HH:mm", true),

MM_DD_HH_MM_SS_CN("MM月dd日 HH:mm:ss", true);

private String value;

private boolean isShowOnly;

DateStyle(String value, boolean isShowOnly) {

this.value = value;

this.isShowOnly = isShowOnly;

}

public String getValue() {

return value;

}

public boolean isShowOnly() {

return isShowOnly;

}

}

Week类

[java] view plain copy

package com.util;

public enum Week {

MONDAY("星期一", "Monday", "Mon.", 1),

TUESDAY("星期二", "Tuesday", "Tues.", 2),

WEDNESDAY("星期三", "Wednesday", "Wed.", 3),

THURSDAY("星期四", "Thursday", "Thur.", 4),

FRIDAY("星期五", "Friday", "Fri.", 5),

SATURDAY("星期六", "Saturday", "Sat.", 6),

SUNDAY("星期日", "Sunday", "Sun.", 7);

String name_cn;

String name_en;

String name_enShort;

int number;

Week(String name_cn, String name_en, String name_enShort, int number) {

this.name_cn = name_cn;

this.name_en = name_en;

this.name_enShort = name_enShort;

this.number = number;

}

public String getChineseName() {

return name_cn;

}

public String getName() {

return name_en;

}

public String getShortName() {

return name_enShort;

}

public int getNumber() {

return number;

}

}

添加日期风格(DateStyle)时需要注意的事项:

1、不允许复的日期风格。例如:yyyy-MM-dd和yyyy-M-d,表现出的风格是相同的。只有当两个日期风格含有不同的字符时,才会看成是不相同的日期风格。例如:yyyy-MM-dd和yyyy-M-d EEE。当含有重复的日期风格时,可以通过isShowOnly=true来区分,isShowOnly=true表示该风格只是“格式化Date类型的日期”用,而不用作“自动判断String类型的日期”。

2、日期必须含有完整年份信息。例如:MM-dd。没有年份的话,判断MM-dd是不准确的,因为无法识别出闰年(2-29)。其实MM-dd等类似的风格,我们日常习惯上,将其看作是“今年的M月d日”,而SimpleDateFormat中的parse方法中默认的年份为1970年。

3、添加顺序为:由简到繁。目的在于2012-12和2012-12-1是等价的,虽然日期风格不一样,但默认会看成是一样的且以DateStyle匹配到的最后一个为主。因此最好将详细的日期风格写在后面。

在下一版本中,我会加入农历的支持,有兴趣的朋友可以关注下。

============友情链接============

Java日期工具类DateUtil-续二 /detail/2566799184.html

java日期工具类DateUtil /detail/2565256104.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: