package org.quickbundle.tools.helper;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.quickbundle.tools.support.log.RmLogHelper;
/**
* @author
* 帮助实现一些通用的日期,时间处理
*/
/**
* @author Administrator
*
*/
public class RmDateHelper {
/** 一天的毫秒数 */
public final static long ONE_DAY_MILLIS = 24 * 60 * 60 * 1000;
/** 本地化为简体中文 */
public final static Locale DEFAULT_CHINA_LOCALE = Locale.SIMPLIFIED_CHINESE;
/** 时区设置为北京时间 */
public final static TimeZone DEFAULT_CHINA_TIMEZONE = TimeZone.getTimeZone("GMT+8:00");
public final static String[] DEFAULT_WEEK_ARRAY_DESC = new String[]{"周一", "周二", "周三", "周四", "周五", "周六", "周日"};
/**
* 取Java虚拟机系统时间, 返回当前时间戳
*
* @return Timestamp类型的时间
*/
public static Timestamp getSysTimestamp() {
return new Timestamp(System.currentTimeMillis());
}
// case 1: // 'y' - YEAR
// case 2: // 'M' - MONTH
// case 3: // 'd' - DATE
// case 4: // 'k' - HOUR_OF_DAY: 1-based. eg, 23:59 + 1 hour =>> 24:59
// case 5: // 'H' - HOUR_OF_DAY:0-based. eg, 23:59 + 1 hour =>> 00:59
// case 6: // 'm' - MINUTE
// case 7: // 's' - SECOND
// case 8: // 'S' - MILLISECOND
// case 9: // 'E' - DAY_OF_WEEK
// case 10: // 'D' - DAY_OF_YEAR
// case 11: // 'F' - DAY_OF_WEEK_IN_MONTH
// case 12: // 'w' - WEEK_OF_YEAR
// case 13: // 'W' - WEEK_OF_MONTH
// case 14: // 'a' - AM_PM
// case 15: // 'h' - HOUR:1-based. eg, 11PM + 1 hour =>> 12 AM
// case 16: // 'K' - HOUR: 0-based. eg, 11PM + 1 hour =>> 0 AM
// case 17: // 'z' - ZONE_OFFSET
// case 18: // 'Z' - ZONE_OFFSET ("-/+hhmm" form)
/**
* 取Java虚拟机系统时间, 返回当前日期
*
* @return 只返回String格式的日期,yyyy-MM-dd, 长10位
*/
public static String getSysDate() {
return new Timestamp(System.currentTimeMillis()).toString().substring(0,10);
}
/**
* 取Java虚拟机系统时间, 返回当前日期和时间
*
* @return 返回String格式的日期和时间, yyyy-MM-dd HH:mm:ss, 长19位
*/
public static String getSysDateTime() {
return new Timestamp(System.currentTimeMillis()).toString().substring(0,19);
}
/**
* 取Java虚拟机系统时间, 返回当前日期和时间+毫秒
*
* @return 返回String格式的日期和时间, yyyy-MM-dd HH:mm:ss.SSS, 长23位
*/
public static String getSysDateTimeMillis() {
String str = new Timestamp(System.currentTimeMillis()).toString();
if(str.length() >= 23) {
return str.substring(0, 23);
} else {
StringBuilder sb = new StringBuilder();
sb.append(str);
for(int i=0; i<23-str.length(); i++) {
sb.append("0");
}
return sb.toString();
}
}
/**
* 获得时间戳
*
* @param strDate YYYY-MM-DD HH24:MI:SS格式的字符串
* @return 时间戳
*/
public static Timestamp getTimestamp(String strDate) {
if(strDate == null || strDate.trim().length()==0) {
return null;
}
return Timestamp.valueOf(formatDateStr(strDate));
}
/**
* 获得日期戳
*
* @param yearMonthDay
* @return
*/
public static java.sql.Date getSqlDate(String yearMonthDay) {
if(yearMonthDay == null || yearMonthDay.trim().length()==0 ) {
return null;
}
Timestamp ts = getTimestamp(yearMonthDay);
if(ts == null) {
return null;
} else {
return new java.sql.Date(ts.getTime());
}
}
/**
* 转化为yyyy-mm-dd hh:mm:ss[.f...]
*
* @param str
* @return
*/
public static String formatDateStr(String str) {
if(str == null) {
return str;
} if(str.trim().length() == 0 || str.trim().matches("^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}(\\.\\d+)?$")) {
return str.trim();
}
//处理2010/03/01
String strDate = str.trim().replaceAll("/", "-");
//处理2010-01-01T00:00:00
strDate = str.trim().replaceAll("T", " ");
//处理'2010-03-01
strDate = strDate.replaceAll("'", "");
if(strDate.indexOf("-") < 0) {
if(strDate.length() >= 16) { //处理20100301235959
strDate = strDate.substring(0,4) + "-" + strDate.substring(4,6) + "-" + strDate.substring(6,8)
+ " " + strDate.substring(8,10) + ":" + strDate.substring(10,12) + ":" + strDate.substring(12,14);
} else if(strDate.length() >= 14) { //处理201003012359
strDate = strDate.substring(0,4) + "-" + strDate.substring(4,6) + "-" + strDate.substring(6,8)
+ " " + strDate.substring(8,10) + ":" + strDate.substring(10,12) + ":00";
} else if(strDate.length() >= 8) { //处理20100301
strDate = strDate.substring(0,4) + "-" + strDate.substring(4,6) + "-" + strDate.substring(6,8);
}
}
//处理2010-03
if(strDate.indexOf("-") == strDate.lastIndexOf("-")) {
strDate = strDate + "-01";
}
//处理03-01-2010
if(strDate.length() - strDate.lastIndexOf("-") == 4) {
strDate = strDate.substring(strDate.lastIndexOf("-")+1) + "-" + strDate.substring(0, strDate.indexOf("-")) + "-" + strDate.substring(strDate.indexOf("-") + 1, strDate.lastIndexOf("-"));
}
//处理9999-03-01
if(strDate.startsWith("9999")) {
strDate = "1900-01-01 00:00:00";
}
if(strDate.matches("^\\d{4}-\\d{2}-\\d{2}$")) {
return strDate + " 00:00:00";
} else if(strDate.matches("^\\d{4}-(\\d{1,2})-(\\d{1,2})$")) {
Matcher ma = Pattern.compile("^(\\d{4}-)(\\d{1,2})(-)(\\d{1,2})$").matcher(strDate);
StringBuilder sb = new StringBuilder();
if(ma.find()) {
sb.append(ma.group(1));
sb.append(ma.group(2).length() == 1 ? "0" + ma.group(2) : ma.group(2));
sb.append(ma.group(3));
sb.append(ma.group(4).length() == 1 ? "0" + ma.group(4) : ma.group(4));
}
sb.append(" 00:00:00");
return sb.toString();
} else if(strDate.matches("^\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}(\\.\\d*)?$")) {
Matcher ma = Pattern.compile("^(\\d{4}-)(\\d{1,2})(-)(\\d{1,2})( )(\\d{1,2})(:)(\\d{1,2})(:)(\\d{1,2})(\\.\\d*)?$").matcher(strDate);
StringBuilder sb = new StringBuilder();
if(ma.find()) {
sb.append(ma.group(1));
sb.append(ma.group(2).length() == 1 ? "0" + ma.group(2) : ma.group(2));
sb.append(ma.group(3));
sb.append(ma.group(4).length() == 1 ? "0" + ma.group(4) : ma.group(4));
sb.append(ma.group(5));
sb.append(ma.group(6).length() == 1 ? "0" + ma.group(6) : ma.group(6));
sb.append(ma.group(7));
sb.append(ma.group(8).length() == 1 ? "0" + ma.group(8) : ma.group(8));
sb.append(ma.group(9));
sb.append(ma.group(10).length() == 1 ? "0" + ma.group(10) : ma.group(10));
sb.append(ma.group(11) != null && ma.group(11).length() > 1 ? ma.group(11) : "");
}
return sb.toString();
} else {
RmLogHelper.error(RmDateHelper.class, "formatDateStr(" + str + ") failed");
return str;
}
}
/**
* 取Java虚拟机系统时间, 返回当前日历
*
* @return 返回String格式的日期和时间, YYYY-MM-DD HH24:MI:SS, 长19位
*/
static String getSysDateTimeByCalendar() {
StringBuffer str = new StringBuffer();
Calendar rightNow = Calendar.getInstance(DEFAULT_CHINA_TIMEZONE, DEFAULT_CHINA_LOCALE);
int iYear = rightNow.get(Calendar.YEAR);
int iMonth = rightNow.get(Calendar.MONTH) + 1;
int iDate = rightNow.get(Calendar.DATE);
int iHour = rightNow.get(Calendar.HOUR_OF_DAY);
int iMinute = rightNow.get(Calendar.MINUTE);
int iSecond = rightNow.get(Calendar.SECOND);
str.append(iYear);
str.append("-");
if(iMonth<10)
str.append("0");
str.append(iMonth);
str.append("-");
if(iDate<10)
str.append("0");
str.append(iDate);
str.append(" ");
str.append(iHour);
if(iHour<10)
str.append("0");
str.append(":");
str.append(iMinute);
if(iMinute<0)
str.append("0");
str.append(":");
if(iSecond<0)
str.append("0");
str.append(iSecond);
return str.toString();
}
/**
* 取Java虚拟机系统时间, 返回当前日历
*
* @return 只返回String格式的日期,YYYY-MM-DD, 长10位
*/
static String getSysDateByCalendar() {
StringBuffer str = new StringBuffer();
Calendar rightNow = Calendar.getInstance(DEFAULT_CHINA_TIMEZONE,DEFAULT_CHINA_LOCALE);
int iYear = rightNow.get(Calendar.YEAR);
int iMonth = rightNow.get(Calendar.MONTH) + 1;
int iDate = rightNow.get(Calendar.DATE);
str.append(iYear);
str.append("-");
if (iMonth < 10) {
str.append("0");
}
str.append(iMonth);
str.append("-");
if (iDate < 10) {
str.append("0");
}
str.append(iDate);
return str.toString();
}
/**
* 功能: 获得本地化的时间
*
* @param dateDesc YYYY-MM-DD HH24:MI:SS 格式的字符串
* @return
*/
public static Calendar getCalendar(String dateDesc) {
Calendar c = Calendar.getInstance(RmDateHelper.DEFAULT_CHINA_TIMEZONE, RmDateHelper.DEFAULT_CHINA_LOCALE);
c.setTime(RmDateHelper.getTimestamp(dateDesc));
return c;
}
/**
* 功能: 获得本地化的时间
*
* @param longDate 时间的长整数
* @return
*/
public static Calendar getCalendar(long longDate) {
Calendar c = Calendar.getInstance(RmDateHelper.DEFAULT_CHINA_TIMEZONE, RmDateHelper.DEFAULT_CHINA_LOCALE);
c.setTimeInMillis(longDate);
return c;
}
/**
* 功能: 获得格式化的日期和时间描述
*
* @param longDate 时间的长整数
* @return YYYY-MM-DD HH24:MI:SS 格式的字符串
*/
public static String getFormatDateTimeDesc(long longDate) {
return new Timestamp(longDate).toString().substring(0, 19);
}
/**
* 功能: 由毫秒数得到小时数
*
* @param longDate
* @return
*/
public static double getHourNumberByLong(long longDate) {
return longDate / 60 * 60 * 1000;
}
/**
* 功能: 判断thisDate是否是今天
*
* @param thisDate
* @return
*/
public static boolean isToday(Date thisDate) {
String today = getFormatDateTimeDesc(System.currentTimeMillis());
String thisDateCal = getFormatDateTimeDesc(thisDate.getTime());
if(today.substring(0,10).endsWith(thisDateCal.substring(0,10))) {
return true;
} else {
return false;
}
}
/**
* 功能: 判断long1-long2和long3-long4区域是否重叠
*
* @param long1
* @param long2
* @param long3
* @param long4
* @return
*/
public static boolean isOverlap(long long1, long long2, long long3, long long4) {
boolean returnValue = false;
if(long3 >= long1 && long3 < long2) {
returnValue = true;
} else if(long4 <= long2 && long4 > long1) {
returnValue = true;
} else if(long3 < long1 && long4 > long2 ) {
returnValue = true;
}
return returnValue;
}
/**
* 功能: 转换时间为字符串,精确到分钟
*
* @param time1 Timestamp
* @return String
*/
public static String getTimePrecMinute(Timestamp time1){
if(time1==null)
return "";
Calendar cal = Calendar.getInstance(RmDateHelper.DEFAULT_CHINA_TIMEZONE, RmDateHelper.DEFAULT_CHINA_LOCALE);
cal.setTimeInMillis(time1.getTime());
//年
String strYear = String.valueOf(cal.get(Calendar.YEAR));
//月
String strMon;
if(cal.get(Calendar.MONTH)+1<10){
strMon = "0"+String.valueOf(cal.get(Calendar.MONTH)+1);
}else{
strMon = String.valueOf(cal.get(Calendar.MONTH)+1);
}
//日
String strDay ;
if(cal.get(Calendar.DATE)<10){
strDay = "0"+String.valueOf(cal.get(Calendar.DATE));
}else{
strDay = String.valueOf(cal.get(Calendar.DATE));
}
//时
String strHour;
if(cal.get(Calendar.HOUR_OF_DAY)<10){
strHour = "0" + String.valueOf(cal.get(Calendar.HOUR_OF_DAY));
}else{
strHour = String.valueOf(cal.get(Calendar.HOUR_OF_DAY));
}
//分
String strMin ;
if(cal.get(Calendar.MINUTE)<10){
strMin = "0" + String.valueOf(cal.get(Calendar.MINUTE));
}else{
strMin = String.valueOf(cal.get(Calendar.MINUTE));
}
return strYear+"-"+strMon+"-"+strDay+" "+strHour+":"+strMin;
}
/**
* 功能: 转换时间为字符串,精确到天
*
* @param time1 Timestamp
* @return String
*/
public static String getStrDatePrecDay(Object otime){
if(otime==null||otime.getClass().getName().equals("java.lang.String"))
return "";
Timestamp time1 = (Timestamp)otime;
Calendar cal = Calendar.getInstance(RmDateHelper.DEFAULT_CHINA_TIMEZONE, RmDateHelper.DEFAULT_CHINA_LOCALE);
cal.setTimeInMillis(time1.getTime());
//年
String strYear = String.valueOf(cal.get(Calendar.YEAR));
//月
String strMon;
if(cal.get(Calendar.MONTH)+1<10){
strMon = "0"+String.valueOf(cal.get(Calendar.MONTH)+1);
}else{
strMon = String.valueOf(cal.get(Calendar.MONTH)+1);
}
//日
String strDay ;
if(cal.get(Calendar.DATE)<10){
strDay = "0"+String.valueOf(cal.get(Calendar.DATE));
}else{
strDay = String.valueOf(cal.get(Calendar.DATE));
}
return strYear+"-"+strMon+"-"+strDay;
}
/**
* 功能: 比较compareDate是否比当前时间早minTime,默认三天内
*
* @param compareDate 要比较的时间
* @return
*/
public static boolean isNew (long compareDate) {
return isNew(compareDate, 3 * ONE_DAY_MILLIS);
}
/**
* 功能: 比较compareDate是否比当前时间早minTime
*
* @param compareDate 要比较的时间
* @param minTime 最小差距
* @return
*/
public static boolean isNew (long compareDate, long minTime) {
if(System.currentTimeMillis() - compareDate > minTime) {
return false;
} else {
return true;
}
}
/**
* 功能: 得到系统时间如20060101010101
*
* @return
*/
public static String getJoinedSysDateTime() {
String str = getSysDateTime();
str = str.substring(0,4) + str.substring(5,7) + str.substring(8,10) + str.substring(11,13) + str.substring(14,16) + str.substring(17,19);
return str;
}
public static String parseToTimeDesciption(long timeL) {
StringBuilder sb = new StringBuilder();
if(timeL / (365L * 24 * 60 * 60 * 1000) > 0) {
sb.append(timeL / (365L * 24 * 60 * 60 * 1000) + "年");
timeL = timeL % (365L * 24 * 60 * 60 * 1000);
}
if(timeL / (24L * 60 * 60 * 1000) > 0) {
sb.append(timeL / (24L * 60 * 60 * 1000) + "天");
timeL = timeL % (24L * 60 * 60 * 1000);
}
if(timeL / (60L * 60 * 1000) > 0) {
sb.append(timeL / (60L * 60 * 1000) + "小时");
timeL = timeL % (60L * 60 * 1000);
}
if(timeL / (60L * 1000) > 0) {
sb.append(timeL / (60L * 1000) + "分钟");
timeL = timeL % (60L * 1000);
}
if(sb.length() == 0) {
sb.append(timeL / 1000L + "秒");
}
return sb.toString();
}
}