package com.xtframe.util;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.logging.Logger;
/**
* 日期相关的共通
*/
public class DateTime {
private final static Logger LOG = Logger.getLogger(DateTime.class.getName());
public DateTime() {
}
public static final String minDate = "1970-01";
public static final String maxDate = "2099-01";
/** 一天的毫秒数 */
public static final long DAY_MILLI = 24 * 60 * 60 * 1000;
/** 1小时的毫秒数 */
public static final long HOUR_MILLI = 60 * 60 * 1000;
/**
* 要用到的缺省的Date only 格式定义 年/月/日
**/
public static String DATE_FORMAT_DATEONLY = "yyyy-MM-dd"; // 年/月/日
/**
* 要用到的缺省的Date time 格式定义 年/月/日 时:分:秒 YYYY/MM/DD HH:MM:SS
**/
public static String DATE_FORMAT_DATETIME = "yyyy-MM-dd HH:mm:ss";
/**
* 闰年的每个月的天数数组
**/
public static int[] DAY_OF_MONTH_LEAP_YEAR = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
/**
* 非闰年的每个月的天数数组
**/
public static int[] DAY_OF_MONTH_NON_LEAP_YEAR = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
/** Global SimpleDateFormat object */
private static SimpleDateFormat sdfDateOnly = new SimpleDateFormat(DateTime.DATE_FORMAT_DATEONLY);
/** Datetime formatter */
private static SimpleDateFormat sdfDateTime = new SimpleDateFormat(DateTime.DATE_FORMAT_DATETIME);
/** Datetime full 格式的定义 */
private static SimpleDateFormat sdfDateTimeFull = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
/*****************************************************
* java.util.Date ==> String 的转换函数
*****************************************************/
/**
* String到Date类型
*
* @param sDate
* 日期字符串
* @return 日期类型
*/
public static java.util.Date toDate(String sDate) {
return toDate(sDate, DateTime.sdfDateOnly);
}
/**
* 根据指定的格式将日期字符串转换为DATE类型
*
* @param sDate
* 日期字符串
* @param sFmt
* 日期格式
* @return 转换后的DATE类型
* @see DateTime#DATE_FORMAT_DATEONLY
* @see DateTime#DATE_FORMAT_DATETIME
* @todo 日期String的长度不对的情况,需要对应
*/
public static java.util.Date toDate(String sDate, String sFmt) {
if (sFmt.equals(DateTime.DATE_FORMAT_DATETIME)) {// Date time
return toDate(sDate, DateTime.sdfDateTime);
} else if (sFmt.equals(DateTime.DATE_FORMAT_DATEONLY)) { // Date only
return toDate(sDate, DateTime.sdfDateOnly);
} else {
// return null;
return toDateAgain(sDate);
}
}
/**
* 利用指定SimpleDateFormat instance转化String到Date
*
* @param sDate
* Date string
* @param formatter
* SimpleDateFormat instance
* @return Date object
* @since 1.0
* @history 2004/05/01 ChenJP: parsing 失败的时候,试图做一些相对智能的处理
*/
private static java.util.Date toDate(String sDate, SimpleDateFormat formatter) {
if (sDate == null) {
return null;
}
java.util.Date dt = null;
try {
dt = formatter.parse(sDate);
} catch (Exception e) {
// log.warn("Exception when parsing date in DateTime.toDate(), original String="
// +sDate + ",formatter pattern=" + formatter.toPattern());
// dt = null;
dt = toDateAgain(sDate);
}
return dt;
}
/**
* 试图做一些相对智能的日期处理
*
* @param sDate
* @return 处理成功,返回Date object;
* @return 处理失败,return null
* @TODO: 是否可能对分隔符号,如"/" 或者":"也做一些智能的处理
*/
private static java.util.Date toDateAgain(String sDate) {
if (sDate == null) {
return null;
}
java.util.Date dt = null;
SimpleDateFormat formatter = null;
// 试图解决日期String长度不对的问题
if (sDate.length() < DateTime.DATE_FORMAT_DATEONLY.length()) { // 长度太短
return null;
} else if (sDate.length() < DateTime.DATE_FORMAT_DATETIME.length()) {
// 根据in Date string的长度,new 一个SimpleDateFormat object,这种效率不高
formatter = new SimpleDateFormat(DateTime.DATE_FORMAT_DATETIME.substring(0, sDate.length()));
} else if (sDate.length() > DateTime.DATE_FORMAT_DATETIME.length()) { // in
// 日期String太长,截断后处理
sDate = sDate.substring(0, DateTime.DATE_FORMAT_DATETIME.length());
formatter = DateTime.sdfDateTime;
}
try {
dt = formatter.parse(sDate);
} catch (Exception e) {
LOG.warning("Exception when parsing date in DateTime.toDateAgain(), original String=" + sDate + ",formatter pattern=" + formatter.toPattern());
dt = null;
}
return dt;
}
/**
* 将一个long 型的毫秒值转换为日期String
*
* @param millis
* @return 返回日期的格式由schema-config.xml中的DateTime 格式指定,缺省为yyyy/mm/dd hi24:mi:ss
*/
public static String toString(long millis) {
return toString(new java.util.Date(millis), DateTime.sdfDateTime);
}
/**
* 将一个long 型的毫秒值转换为日期String
*
* @param millis
* @return 精确到毫秒的日期String,格式固定为"yyyy/MM/dd HH:mm:ss.SSS" deprecated
* 不推荐使用,目前仅Debug method中需要使用此method
*/
public static String toStringFull(long millis) {
return toString(new java.util.Date(millis), DateTime.sdfDateTimeFull);
}
/*****************************************************
* String ==> java.util.Date 的转换函数
*****************************************************/
/**
* 将日期DATE的变量转换为年月日字符串
*
* @param dt
* 日期类型的变量
* @return 返回转换以后的字符串
*/
public static String toString(java.util.Date dt) {
return toString(dt, DateTime.sdfDateOnly);
}
/**
* 将日期DATE的变量转换为指定格式的字符串
*
* @param dt
* 日期类型的变量
* @param sFmt
* 日期格式,DateTime中定义的两个常量,最终的格式来源与schma-config.xml中的定义.
* @return 返回转换以后的字符串;如果指定的格式不符合定义的两种缺省格式,将返回Date.toString
*/
public static String toString(java.util.Date dt, String sFmt) {
// log.debug("DateTime.toString sFmt="+sFmt);
// log.debug("DateTime.sdfDateTime="+DATE_FORMAT_DATETIME);
if (dt == null) {
return "";
}
if (sFmt.equals(DateTime.DATE_FORMAT_DATETIME)) { // Date time
return toString(dt, DateTime.sdfDateTime);
} else if (sFmt.equals(DateTime.DATE_FORMAT_DATEONLY)) { // Date only
return toString(dt, DateTime.sdfDateOnly);
} else { // Default , YYYY/MM/DD
LOG.severe("Unknown date format in DateTime.toString, dateFormat = " + sFmt);
return dt.toString();
}
}
/**
* 利用指定SimpleDateFormat instance转换java.util.Date到String
*
* @param dt
* java.util.Date instance
* @param formatter
* SimpleDateFormat Instance
* @return 转换为的String
* @since 1.0
*/
private static String toString(java.util.Date dt, SimpleDateFormat formatter) {
if (dt == null || formatter == null) {
return "";
}
String sRet = null;
try {
sRet = formatter.format(dt);
} catch (Exception e) {
LOG.severe("Exception in DateTime.toString");
sRet = dt.toString();
}
return sRet;
}
/**
* 在java.util.Date类型时间戳上增加/减少几天得到的新的时间戳
*
* @param date
* java.util.Date类型的时间戳
* @param days
* 增加/减少的天数(此值>0表示是增加,<0表示是减少)
* @return 计算后的日期
*/
public static java.util.Date addDays(java.util.Date date, int days) {
long temp = date.getTime();
return new java.util.Date(temp + DateTime.DAY_MILLI * days);
}
/**
* 把java.util.Date类型的日期转换为java.util.GregorianCalendar的日期
*
* @param date
* java.util.Date类型的日期
* @return java.util.GregorianCalendar的日期
*/
private static java.util.GregorianCalendar convertToCalendar(java.util.Date date) {
GregorianCalendar obj = new GregorianCalendar();
obj.setTime(date);
return obj;
}
/**
* 在Date String时间戳上增加/减少几天得到的新的时间戳
*
* @param date
* String类型的时间戳,date的格式应该是定义在schema-config.xml中的Date Only的格式
* @param days
* 增加/减少的天数
* @return String类型的时间戳
* @see DateTime#toDate(String)
* @see DateTIme#addDays(String)
*/
public static String addDays(String date, int days) {
try {
return DateTime.toString(DateTime.addDays(DateTime.toDate(date), days));
} catch (Exception e) {
LOG.severe("Exception in addDays,date=" + date + ",days add=" + days);
return "";
}
}
/**
* 在String类型时间戳上增加/减少几个月得到的新的时间戳 日期的格式定义在schema-config.xml中
*
* @param paraDate
* String类型的时间
* @param mon
* 增加/减少的月数
* @return String类型的时间
*/
public static String addMonths(String paraDate, int mon) {
java.util.Date date = DateTime.toDate(paraDate);
if (date == null) {
return "";
}
GregorianCalendar obj = DateTime.convertToCalendar(date);
// month : 0 -- 11
int year = obj.get(GregorianCalendar.YEAR);
int month = obj.get(GregorianCalendar.MONTH) + 1;
int day = obj.get(GregorianCalendar.DAY_OF_MONTH);
month += mon;
if (month < 1) {
month += 12;
year--;
} else if (month > 12) {
month -= 12;
year++;
}
int lastDay = 0;
// 对应通沙2004/03/30出现的Bug
boolean laterThanLastMonth = false;
if (obj.isLeapYear(year)) {
laterThanLastMonth = (day > DateTime.DAY_OF_MONTH_LEAP_YEAR[month - 1]);
} else {
laterThanLastMonth = (day > DateTime.DAY_OF_MONTH_NON_LEAP_YEAR[month - 1]);
}
if (isLastDayOfMonth(obj) || laterThanLastMonth) {
if (obj.isLeapYear(year)) {
lastDay = DateTime.DAY_OF_MONTH_LEAP_YEAR[month - 1];
} else {
lastDay = DateTime.DAY_OF_MONTH_NON_LEAP_YEAR[month - 1];
}
if (lastDay < day) { // 结果的月份没有对应的天,则缩小天
day = lastDay;
}
}
obj.set(year, month - 1, day);
java.util.Date resultDate = new java.util.Date(obj.getTimeInMillis());
return DateTime.toString(resultDate);
}
/****************************************************
* 后续要deprecated 的method
*****************************************************/
/**
* 比较两个java.sql.Timestamp instance 的年月日部分是否相同
*
* @param date1
* java.sql.Timestamp类型的时间措1
* @param date2
* java.sql.Timestamp类型的时间措2
* @return 返回True : 年月日部分相同
* @return 返回False: 年月日部分不同
* @deprecated
*/
public static boolean isSameDay(java.sql.Timestamp date1, java.sql.Timestamp date2) {
String s1, s2 = null;
s1 = date1.toString().substring(0, DateTime.DATE_FORMAT_DATEONLY.length());
s2 = date2.toString().substring(0, DateTime.DATE_FORMAT_DATEONLY.length());
// cat.debug("in isSameDay() , s1=" + s1 + ",s2=" + s2);
return s1.equalsIgnoreCase(s2);
}
/**
* 取得指定日期所在周的第一天(Sunday)
*
* @param timestamp
* java.sql.Timestamp类型的日期
* @return 返回java.sql.Timestamp类型的日期
*/
public static java.sql.Timestamp getFirstDayOfWeek(java.sql.Timestamp timestamp) {
int no = DateTime.getWeekdayOfTimestamp(timestamp);
java.sql.Timestamp out = DateTime.addDays(timestamp, 1 - no);
return out;
}
/**
* 取得指定日期所在周的最后一天(Saturday)
*
* @param timestamp
* , java.sql.Timestamp类型的时间戳
* @return java.sql.Timestamp类型的时间戳
*/
public static java.sql.Timestamp getLastDayOfWeek(java.sql.Timestamp timestamp) {
int no = DateTime.getWeekdayOfTimestamp(timestamp);
java.sql.Timestamp out = DateTime.addDays(timestamp, 7 - no);
return out;
}
/**
* 取得指定日期所在月的1号所在周的Sunday(可能是上个月的日期)
*
* @param timestamp
* java.sql.Timestamp类型的日期
* @return 返回java.sql.Timestamp类型的日期
*/
public static java.sql.Timestamp getFirstSundayOfMonth(java.sql.Timestamp timestamp) {
java.sql.Timestamp out = null;
if (timestamp == null)
return null;
out = getFirstDayOfMonth(timestamp);
out = DateTime.getFirstDayOfWeek(out);
return out;
}
/**
* 取得指定日期所在月的最后一天(如31号)所在周的Saturday(可能是下个月的日期)
*
* @param timestamp
* , java.sql.Timestamp Object
* @return java.sql.Timestamp instance
*/
public static java.sql.Timestamp getLastSaturdayOfMonth(java.sql.Timestamp timestamp) {
java.sql.Timestamp out = null;
if (timestamp == null)
return null;
// cat.debug("In timestamp=" + timestamp.toString() );
out = getLastDayOfMonth(timestamp);
// cat.debug("LastDayOfMonth=" + out.toString() );
out = DateTime.getLastDayOfWeek(out);
// cat.debug("LastSaturdayOfMonth=" + out.toString() );
return out;
}
/**
* 取得指定日期所在月的第一天
*
* @param timestamp
* , java.sql.Timestamp Object
* @return java.sql.Timestamp instance
*/
public static java.sql.Timestamp getFirstDayOfMonth(java.sql.Timestamp timestamp) {
java.sql.Timestamp out = null;
if (timestamp == null)
return null;
int day = DateTime.getDayOfTimestamp(timestamp);
out = DateTime.addDays(timestamp, 1 - day);
// out = DateTime.getFirstDayOfWeek(out);
return out;
}
/**
* 取得两个日期之间的日数
*
* @param t1
* java.sql.Timestamp类型的日期1
* @param t2
* java.sql.Timestamp类型的日期2
* @return 返回t1到t2间的日数。如果t2在t1之后,返回正数,否则返回负数
*/
public static long daysBetween(java.sql.Timestamp t1, java.sql.Timestamp t2) {
return (t2.getTime() - t1.getTime()) / DAY_MILLI;
}
/**
* Format year/month/day to YYYY/MM/DD format
*
* @param year
* @param month
* @param day
* @return YYYY/MM/DD format String
*/
private static String formatYMD(int year, int month, int day) {
String temp = String.valueOf(year) + "/";
if (month < 10) {
temp += "0" + String.valueOf(month) + "/";
} else {
temp += String.valueOf(month) + "/";
}
if (day < 10) {
temp += "0" + String.valueOf(day);
} else {
temp += String.valueOf(day);
}
return temp;
}
/**
* 取得指定日期的所在月的最后一天 目前只支持YYYY/MM/DD格式
*
* @param timestamp
* Timestamp类型的日期
* @return Timestamp类型的日期
*/
public static java.sql.Timestamp getLastDayOfMonth(java.sql.Timestamp timestamp) {
java.sql.Timestamp out = null;
if (timestamp == null)
return null;
// out = (java.sql.Timestamp )timestamp.clone() ;
// day = DateTime.getDayOfTimestamp(timestamp);
// int month = DateTime.getMonthOfTimestamp(timestamp);
GregorianCalendar obj = DateTime.convertToCalendar(timestamp);
// month : 0 -- 11
int day = 0;
int year = obj.get(GregorianCalendar.YEAR);
int month = obj.get(GregorianCalendar.MONTH) + 1;
if (obj.isLeapYear(obj.get(GregorianCalendar.YEAR))) {
day = DateTime.DAY_OF_MONTH_LEAP_YEAR[month - 1];
} else {
day = DateTime.DAY_OF_MONTH_NON_LEAP_YEAR[month - 1];
}
/*
* modified by ChenJP 2000/11/16 String temp = String.valueOf(year) +
* "/"; if( month < 10 ){ temp += "0" + String.valueOf(month) + "/";
* }else{ temp += String.valueOf(month)+ "/"; } if( day < 10 ){ temp +=
* "0" + String.valueOf(day); }else{ temp += String.valueOf(day); }
* //cat.debug("temp=" + temp); out = DateTime.toSqlTimestamp(temp);
*/
out = DateTime.toSqlTimestamp(DateTime.formatYMD(year, month, day));
/*
* obj.set(GregorianCalendar.DAY_OF_MONTH , day) ; out = new
* java.sql.Timestamp(obj.getTimeInMillis()); out =
* DateTime.addDays(timestamp, 10) ; out =
* DateTime.getFirstDayOfWeek(out);
*/
return out;
}
/*****************************************************
* 把java.sql.Timestamp Object 取出各部分的值
*****************************************************/
/**
* 从java.sql.Timestamp日期信息中取出年
*
* @param timestamp
* java.sql.Timestamp日期信息
* @return 返回年
*/
public static int getYearOfTimestamp(java.sql.Timestamp timestamp) {
GregorianCalendar obj = DateTime.convertToCalendar(timestamp);
return obj.get(GregorianCalendar.YEAR);
}
/**
* 从java.sql.Timestamp 日期中取出月份信息
*
* @param timestamp
* java.sql.Timestamp类型的日期
* @return 返回月份(1 -- 12 )
*/
public static int getMonthOfTimestamp(java.sql.Timestamp timestamp) {
GregorianCalendar obj = DateTime.convertToCalendar(timestamp);
return (obj.get(GregorianCalendar.MONTH) + 1);
}
/**
* 从java.sql.Timestamp日期中取出日信息
*
* @param timestamp
* java.sql.Timestamp类型的日期
* @return 返回日信息
*/
public static int getDayOfTimestamp(java.sql.Timestamp timestamp) {
GregorianCalendar obj = DateTime.convertToCalendar(timestamp);
return obj.get(GregorianCalendar.DAY_OF_MONTH);
}
/**
* 从java.sql.Timestamp类型的日期中取出周日1-7的信息
*
* @param timestamp
* java.sql.Timestamp类型的日期
* @return WeekDay周日信息
*/
public static int getWeekdayOfTimestamp(java.sql.Timestamp timestamp) {
GregorianCalendar obj = DateTime.convertToCalendar(timestamp);
return obj.get(GregorianCalendar.DAY_OF_WEEK);
}
/**
* 返回指定日期的零时的Timestamp值
*
* @return 返回指定日期的零时的Timestamp值
* @param timestamp
* 返回指定日期的零时的Timestamp值
*/
public static java.sql.Timestamp getZeroTime(java.sql.Timestamp timestamp) {
if (timestamp == null) {
return null;
}
return DateTime.toSqlTimestamp(DateTime.toString(new Date(timestamp.getTime())));
// String tempStr = timestamp.toString().substring(0, 10);
// return DateTime.toSqlTimestamp(tempStr);
}
/**
* 从java.sql.Timestamp类型的日期中取出时间:分钟信息 HH:MM
*
* @param timestamp
* java.sql.Timestamp类型的日期
* @return 返回HH:MM格式的时分信息
*/
public static String getHourAndMinuteString(java.sql.Timestamp timestamp) {
String out = null;
GregorianCalendar obj = DateTime.convertToCalendar(timestamp);
int hour = obj.get(GregorianCalendar.HOUR_OF_DAY);
int minute = obj.get(GregorianCalendar.MINUTE);
if (minute < 10) {
out = String.valueOf(hour) + ":0" + String.valueOf(minute);
} else {
out = String.valueOf(hour) + ":" + String.valueOf(minute);
}
return out;
}
/**
* 从java.sql.Timestamp Object 中取出24小时制的时间信息
*
* @param timestamp
* java.sql.Timestamp类型的日期
* @return 24小时制的hour value
*/
public static int getHourOfTimestamp(java.sql.Timestamp timestamp) {
GregorianCalendar obj = DateTime.convertToCalendar(timestamp);
return obj.get(GregorianCalendar.HOUR_OF_DAY);
}
/**
* 从java.sql.Timestamp类型的日期中取出分钟信息
*
* @param timestamp
* java.sql.Timestamp类型的日期
* @return 返回分钟信息
*/
public static int getMinuteOfTimestamp(java.sql.Timestamp timestamp) {
GregorianCalendar obj = DateTime.convertToCalendar(timestamp);
return obj.get(GregorianCalendar.MINUTE);
}
/**
* 从java.sql.Timestamp类型的日期中取出秒信息
*
* @param timestamp
* java.sql.Timestamp类型的日期
* @return 返回秒信息
*/
public static int getSecondOfTimestamp(java.sql.Timestamp timestamp) {
GregorianCalendar obj = DateTime.convertToCalendar(timestamp);
return obj.get(GregorianCalendar.SECOND);
}
/**
* 把java.sql.Timestamp类型的日期转换为java.util.GregorianCalendar的日期
*
* @param timestamp
* java.sql.Timestamp类型的日期
* @return java.util.GregorianCalendar的日期
* @deprecated
*/
public static java.util.GregorianCalendar convertToCalendar(java.sql.Timestamp timestamp) {
GregorianCalendar obj = new GregorianCalendar();
// Modified by ChenJP 2000/11/17
obj.setTime(DateTime.convertTimestampToDate(timestamp));
// 下面的method不能用,long ==> int 精度不对
// obj.set(GregorianCalendar.MILLISECOND , (int)timestamp.getTime() );
return obj;
}
/**
* 把java.sql.Timestamp类型的日期转换为java.util.Date类型的日期
*
* @param timestamp
* java.sql.Timestamp类型的日期
* @return java.util.Date类型的日期
*/
public static java.util.Date convertTimestampToDate(java.sql.Timestamp timestamp) {
java.util.Date date = null;
date = new Date(timestamp.getTime());
return date;
}
/*****************************************************
* 取系统日期、时间的函数
*****************************************************/
/**
* 取系统日期、时间的函数。返回long型的系统日期时间
*
* @return long型的系统时间
* @see System.currentTimeMillis()
*/
public static long getSysDateLong() {
return System.currentTimeMillis();
}
/**
* 返回java.sql.Timestamp型的SYSDATE
*
* @return java.sql.Timestamp型的SYSDATE
*/
public static java.sql.Timestamp getSysDateTimestamp() {
return new java.sql.Timestamp(System.currentTimeMillis());
}
/**
* 以配置的Date Only的格式返回系统日期
*
* @return 系统日期
*/
public static String getSysDateString() {
return toString(new java.util.Date(System.currentTimeMillis()), DateTime.sdfDateOnly);
}
/**
* 以配置的Datetime格式返回系统日期时间
*
* @return 系统日期时间
*/
public static String getSysDateTimeString() {
return toString(new java.util.Date(System.currentTimeMillis()), DateTime.sdfDateTime);
}
/**
* 以固定的YYYY/MM/DD HH24:MI:SS.sss格式返回系统日期时间
*
* @return 系统日期时间,准确到毫秒, YYYY/MM/DD HH24:MI:SS.sss
* @since 2003/09/04
*/
public static String getSysDateFullString() {
return toStringFull(System.currentTimeMillis());
}
/*****************************************************
* java.sql.Date ==> String 的转换函数
*****************************************************/
/**
* 利用指定日期格式把字符串转化到java.sql.Date类型
*
* @param sDate
* 日期字符串
* @return 返回java.sql.Date类型的日期
* @history 2004/04/30 保证日期格式的灵活性
*/
public static java.sql.Date toSqlDate(String sDate) {
// return toSqlDate( sDate, this.DATE_FORMAT_DATEONLY );
// java.sql.Date.value() 要求的格式必须为YYYY-MM-DD
return new java.sql.Date(DateTime.toDate(sDate).getTime());
// return java.sql.Date.valueOf(sDate.replace('/', '-'));
}
/*****************************************************
* String ==> java.sql.Date 的转换函数
*****************************************************/
/**
* 将java.sql.Date类型的日期转换到日期字符串(格式为YYYY/MM/DD)
*
* @param dt
* java.sql.Date 日期
* @return 字符串(YYYY/MM/DD)
* @history 2004/04/30 保证日期格式的灵活性
*/
public static String toSqlDateString(java.sql.Date dt) {
return DateTime.toString(new Date(dt.getTime()));
// String temp = null;
// temp = dt.toString();
// return temp.replace('-', '/');
}
/*****************************************************
* java.sql.Timestamp ==> String 的转换函数
*****************************************************/
/**
* 转换GregorianCalendar Object到java.sql.Timestamp
*
* @param gcal
* GregorianCalendar Object
* @return java.sql.Timestamp object
* @since 1.0
*/
/*
* public static java.sql.Timestamp toSqlTimestamp(GregorianCalendar gcal){
* return new
* java.sql.Timestamp((long)gcal.get(GregorianCalendar.MILLISECOND) ); }
*/
/**
* 将符合定义格式的Date only日期字符串转换到java.sql.Timestamp类型的时间戳
*
* @param sDate
* 日期字符串(格式=YYYY/MM/DD)
* @return java.sql.Timestamp类型时间戳
*/
public static java.sql.Timestamp toSqlTimestamp(String sDate) {
if (sDate == null)
return null;
// if (sDate.length() != DateTime.DATE_FORMAT_DATEONLY.length())
// return null;
return toSqlTimestamp(sDate, DateTime.DATE_FORMAT_DATEONLY);
}
/**
* 利用指定格式的日期字符串转化到java.sql.Timestamp时间戳
*
* @param sDate
* 日期字符串
* @param sFmt
* 日期格式 DATE_FORMAT_DATEONLY/DATE_FORMAT_DATETIME
* @return java.sql.Timestamp 时间戳
* @history 2004/04/29 先把String转换为Date,然后利用Date的long 毫秒值来取得Timestamp
* @history 2004/05/12 增加日期转换失败为Null的情况下,应该返回Null的判断
*/
public static java.sql.Timestamp toSqlTimestamp(String sDate, String sFmt) {
Date date = DateTime.toDate(sDate, sFmt);
if (date != null) {
return new java.sql.Timestamp(date.getTime());
} else {
return null;
}
/*
* String temp = null; if (sDate == null || sFmt == null) return null;
* if (sDate.length() != sFmt.length()) return null; if
* (sFmt.equals(DateTime.DATE_FORMAT_DATETIME)) { temp =
* sDate.replace('/', '-'); temp = temp + ".000000000"; } else if
* (sFmt.equals(DateTime.DATE_FORMAT_DATEONLY)) { temp =
* sDate.replace('/', '-'); temp = temp + " 00:00:00.000000000";
*
* } else { return null; } //java.sql.Timestamp.value()
* 要求的格式必须为yyyy-mm-dd hh:mm:ss.fffffffff return
* java.sql.Timestamp.valueOf(temp);
*/
}
/*****************************************************
* String ==> java.sql.Date 的转换函数
*****************************************************/
/**
* 将java.sql.Timestamp类型的时间戳转换到字符串格式为YYYY/MM/DD
*
* @param dt
* java.sql.Timestamp类型的时间戳
* @return 日期字符串
*/
public static String toSqlTimestampString(java.sql.Timestamp dt) {
// if (dt == null)
// return null;
return toSqlTimestampString(dt, DateTime.DATE_FORMAT_DATEONLY);
}
/**
* 将java.sql.Timestamp时间戳转换到日期字符串,格式为YYYY/MM/DD HH24:MI
*
* @param dt
* java.sql.Timestamp日期时间戳
* @return 日期字符串
* @history 2004/04/29 schema-config.xml
* 中定义的Datetime格式可能小于16,所以返回是的substring ,应该先判断长度
*/
public static String toSqlTimestampString2(java.sql.Timestamp dt) {
if (dt == null)
return null;
String temp = toSqlTimestampString(dt, DateTime.DATE_FORMAT_DATETIME);
return temp.substring(0, 16 < DateTime.DATE_FORMAT_DATETIME.length() ? 16 : DateTime.DATE_FORMAT_DATETIME.length());
}
/**
* 将java.sql.Timestamp时间戳转换到日期字符串,schema-config.xml中指定的datetime 格式
* NULL的场合,转换为NULL
*
* @param dt
* java.sql.Timestamp 日期时间戳
* @return 日期字符串
*/
public static String toString(java.sql.Timestamp dt) {
return dt == null ? "" : toSqlTimestampString2(dt);
}
/**
* 将指定的java.sql.Timestamp类型的日期转变为指定的中文日期格式字符串 YYYY年MM月DD日 HH:MM:SS
*
* @param timestamp
* java.sql.Timestamp类型的日期
* @return 中文日期格式字符串
* @deprecated
*/
public static String convertTimestampToChinaCalendar(Timestamp timestamp) {
StringBuffer sb = new StringBuffer();
if (timestamp == null) {
sb.append(" ");
} else {
sb = new StringBuffer();
sb.append(DateTime.getYearOfTimestamp(timestamp));
sb.append("年");
sb.append(DateTime.getMonthOfTimestamp(timestamp));
sb.append("月");
sb.append(DateTime.getDayOfTimestamp(timestamp));
sb.append("日");
sb.append(" ");
sb.append(DateTime.getHourOfTimestamp(timestamp));
sb.append(":");
if (DateTime.getMinuteOfTimestamp(timestamp) < 10) {
sb.append(0);
sb.append(DateTime.getMinuteOfTimestamp(timestamp));
} else {
sb.append(DateTime.getMinuteOfTimestamp(timestamp));
}
sb.append(":");
if (DateTime.getSecondOfTimestamp(timestamp) < 10) {
sb.append(0);
sb.append(DateTime.getSecondOfTimestamp(timestamp));
} else {
sb.append(DateTime.getSecondOfTimestamp(timestamp));
}
}
return sb.toString();
}
/**
* 根据指定的java.sql.Timestamp类型的时间戳转换到指定格式的字符串
*
* @param dt
* java.sql.Timestamp类型的时间戳
* @param sFmt
* 日期格式,DATE_FORMAT_DATEONLY/DATE_FORMAT_DATETIME
* @return 指定格式的日期字符串
* @history 2004/04/29: 先转换为Date,然后利用Date ==> String
* @see #toString(Date,String)
*/
public static String toSqlTimestampString(java.sql.Timestamp dt, String sFmt) {
if (dt == null) {
return null;
}
return DateTime.toString(new Date(dt.getTime()), sFmt);
}
/**
* 将java.sql.Timestamp类型的日期转换到HH24:MI格式的时间字符串
*
* @param dt
* java.sql.Timestamp类型的字符串
* @return HH24:MI格式的时间字符串
*/
public static String toHourMinString(java.sql.Timestamp dt) {
String temp = null;
temp = dt.toString();
// int len = 0;
// len = DateTime.DATE_FORMAT_DATETIME.length ();
temp = temp.substring(11, 16);
return temp;
}
/*****************************************************
* java.sql.Timestamp +/- 几天的计算函数
*****************************************************/
/**
* 判断指定的日期是否是一个月的最后一天
*
* @param obj
* GregorianCalendar object
*/
private static boolean isLastDayOfMonth(GregorianCalendar obj) {
int year = obj.get(GregorianCalendar.YEAR);
int month = obj.get(GregorianCalendar.MONTH) + 1;
int day = obj.get(GregorianCalendar.DAY_OF_MONTH);
if (obj.isLeapYear(year)) {
// Modified by ChenJP, 2004/03/30, 2月份没有30号
// if (day == DateTime.DAY_OF_MONTH_LEAP_YEAR[month - 1]){
if (day >= DateTime.DAY_OF_MONTH_LEAP_YEAR[month - 1]) {
return true;
}
} else {
// Modified by ChenJP, 2004/03/30, 2月份没有30号
// if (day == DateTime.DAY_OF_MONTH_NON_LEAP_YEAR[month - 1])
if (day >= DateTime.DAY_OF_MONTH_NON_LEAP_YEAR[month - 1]) {
return true;
}
}
return false;
}
/**
* 在java.sql.Timestamp类型时间戳上增加/减少几个月得到的新的时间戳
*
* @param timestamp
* java.sql.Timestamp类型的时间戳
* @param mon
* 增加/减少的月数
* @return java.sql.Timestamp类型的时间戳
*/
public static java.sql.Timestamp addMonths(java.sql.Timestamp timestamp, int mon) {
java.sql.Timestamp out = null;
GregorianCalendar obj = DateTime.convertToCalendar(timestamp);
// month : 0 -- 11
int year = obj.get(GregorianCalendar.YEAR);
int month = obj.get(GregorianCalendar.MONTH) + 1;
int day = obj.get(GregorianCalendar.DAY_OF_MONTH);
month += mon;
if (month < 1) {
month += 12;
year--;
} else if (month > 12) {
month -= 12;
year++;
}
// 对应通沙2004/03/30出现的Bug
boolean laterThanLastMonth = false;
if (obj.isLeapYear(year)) {
laterThanLastMonth = (day > DateTime.DAY_OF_MONTH_LEAP_YEAR[month - 1]);
} else {
laterThanLastMonth = (day > DateTime.DAY_OF_MONTH_NON_LEAP_YEAR[month - 1]);
}
// 是否是一个月的最后一天
if (isLastDayOfMonth(obj) || laterThanLastMonth) {
if (obj.isLeapYear(year)) {
day = DateTime.DAY_OF_MONTH_LEAP_YEAR[month - 1];
} else {
day = DateTime.DAY_OF_MONTH_NON_LEAP_YEAR[month - 1];
}
}
// Modified by SJNS/zq at 2009.10.29 支持HH:MM:SS
String temp = DateTime.formatYMD(year, month, day);
temp = temp + " " + DateTime.toHourMinString(timestamp) + ":00";
out = DateTime.toSqlTimestamp(temp, DateTime.DATE_FORMAT_DATETIME);
return out;
}
/**
* 在java.sql.Timestamp类型时间戳上增加/减少几天得到的新的时间戳
*
* @param timestamp
* java.sql.Timestamp类型的时间戳
* @param days
* 增加/减少的天数
* @return java.sql.Timestamp类型的时间戳
*/
public static java.sql.Timestamp addDays(java.sql.Timestamp timestamp, int days) {
java.util.Date date = DateTime.convertTimestampToDate(timestamp);
long temp = date.getTime();
return new java.sql.Timestamp(temp + DateTime.DAY_MILLI * days);
}
// ***********************************************************************
// Framework DateTime.java 原有的method
// ********************************************************************
/**
* Return the current date as a formatted string
*
* @return String The current date
* @deprecated
*/
public synchronized static String getDateString() {
return DateTime.toString(new Date(System.currentTimeMillis()));
} /* getDateString() */
/**
*
*
* @param now
* @return
* @deprecated
*/
public synchronized static String getDateString(Calendar now) {
return DateTime.toString(new Date(now.getTimeInMillis()), DateTime.DATE_FORMAT_DATETIME);
} /* getDateString(Calendar) */
/**
* Get a date/time field formatted for insertion into a database Value of
* the date/time is the current date and time
*
* @return String The formatted date time field
* @deprecated
*/
public synchronized static String getDateTimeForDB() {
return getDateTimeForDB(new Date());
} /* getDateTimeForDB() */
/**
* Get a date/time field formatted for insertion into a database Value of
* the date/time is the current date and time
*
* @param year
* @param month
* @param day
* @param hour
* @param min
* @param sec
* @return String The formatted date time field
* @deprecated
*/
public synchronized static String getDateTimeForDB(int year, int month, int day, int hour, int min, int sec) {
Calendar cal = new GregorianCalendar(year, month, day, hour, min, sec);
return getDateTimeForDB(cal.getTime()).trim();
} /* getDateTimeForDB(int, int, int, int, int, int) */
/**
* Get a date/time field formatted for insertion into a database
*
* @param date
* @return String The formatted date time field
* @deprecated
*/
public synchronized static String getDateTimeForDB(Date date) {
// Format the current time. SimpleDateFormat formatter
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ");
Date currentTime_1 = date;
String dateString = formatter.format(currentTime_1);
return dateString.trim();
} /* getDateTimeForDB(Date) */
/**
* Get a date/time string containing the current date and time, formatted
* for user readability
*
* @return String The formatted current date/time
* @deprecated
*/
public synchronized static String getDateTimeString() {
/*
* Calendar rightNow = Calendar.getInstance(); return new String("" +
* (rightNow.get(Calendar.MONTH) + 1)+ "/" +
* rightNow.get(Calendar.DAY_OF_MONTH) + "/" +
* rightNow.get(Calendar.YEAR) + " " + rightNow.get(Calendar.HOUR) + ":"
* + rightNow.get(Calendar.MINUTE) + ":" +
* rightNow.get(Calendar.SECOND)).trim();
*/
// Format the current time. SimpleDateFormat formatter
SimpleDateFormat formatter = new SimpleDateFormat("E',' MMM d yyyy 'at' hh:mm:ss a");
Date currentTime_1 = new Date();
String dateString = formatter.format(currentTime_1);
return dateString.trim();
} /* getDateTimeString() */
/**
* Get a date/time string for a given date and time, formatted for user
* readability
*
* @return String The formatted current date/time
* @deprecated
*/
public synchronized static String getDateTimeString(Date date) {
// Format the current time. SimpleDateFormat formatter
SimpleDateFormat formatter = new SimpleDateFormat("E',' MMM d yyyy 'at' hh:mm:ss a");
String dateString = formatter.format(date);
return dateString.trim();
} /* getDateTimeString() */
/**
* get the min dateTime just as "0001/01/01" or "0001/01/01 00:00:00"
*
* @param sFmt
* date format by user's setting
* @return String the
*/
public synchronized static String getMinDateTime(String sFmt) {
Calendar cal = new GregorianCalendar(1, 0, 1, 0, 0, 0);
Date dt = cal.getTime();
return toString(dt, sFmt);
} /* getMinDateTime(String) */
/**
* added by huangzz on 2007/01/05
* get the max dateTime just as "9999/12/31" or "9999/12/31 23:59:59"
*
* @param sFmt
* date format by user's setting
* @return String
*/
public synchronized static String getMaxDateTime(String sFmt) {
Calendar cal = new GregorianCalendar(9999, 11, 31, 23, 59, 59);
Date dt = cal.getTime();
return toString(dt, sFmt);
} /* getMaxDateTime(String) */
} /* DateTime */