关于日期的时间戳应用

由于最近在群里经常被问到,在数据库中怎么处理时间问题。这个问题可能对于我来说可能只是一个小点。今天我就这个问题总结一下。

首先当然是根据需求来定你的字段类型;我列举了几种情况,如果有不全望网友告知,我会及时补充的。

1. 只做展示用的时间字段

2. 用做筛选用的时间字段

3. 用作定时用的时间字段

4. 用作筛选和展示的时间字段


1 :字符串类型

      第一种作为字符串存在就好。因为只做展示使用,一个属性值,直接存时间格式 如:“2016-12-12 21:03”这种字符串,存进去什么样子,取出来就是什么样子完全没必要更改什么。既存即用

/**
	 * @Title 字符串转化为日期
	 * @param _dataString 需要转化的日期字符
	 * @param _formatDate 需要格式化日期的类型    比如:"yyyy-MM-dd HH:mm:ss"或者"yyyy-MM-dd"
	 * @return <b>Date</b> 日期类型
	 * @author Liberty_G.
	 * @date 2016-4-22
	 * @version V_1.0 <br/>
	 */
	public static Date stringToDate(String _dataString, String _formatDate){
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(_formatDate);
		
		Date date = null;
		
		try {
			date = simpleDateFormat.parse(_dataString);
		} catch (ParseException e) {
			System.out.println("Date format Exception The Reason\n"+ e.getMessage());
			e.printStackTrace();
		}
		return date;
	}

2:筛选用的字符串的话,选择就多了。

       1. 可以存Date格式。但是必须要转化为sql的Date就是把util包下的date转为sql包下的date。数据库中的date对应java.sql.Date;  把 java.uitl.Date存储到数据库,需要把 java.uitl.Date转化为java.sql.Date。比对筛选的时候就用mysql的now函数来查找范围。

       Date utilDate = new Date();
       java.sql.Date sqlDate = newjava.sql.Date(utilDate.getTime());然后就可以用sqlDate存入数据库了。
      2. 转化为时间戳(是我现在常用的方法)。转化为时间戳格式。直接比对时间戳大小。把日期格式转化为时间戳。这样的话就可以直接对这个long型的数比较大小。数据库也是直接比较long型大小。

/**
   	 * @Title 获取当前日期时间戳
   	 * @return <b>String</b> 返回时间戳 如果失败 返回空
   	 * @author Liberty_G.
   	 * @date 2016-4-27
   	 * @version V_1.1 <br/>
   	 */
    public static long getTimestamp() {
    	Date date = new Date();
    	return getTimestamp(date);
    }
/**
	 * @Title 获取指定日期时间戳
	 * @param _date 指定的日期对象
	 * @return <b>String</b> 返回时间戳 如果失败 返回空
	 * @author Liberty_G.
	 * @date 2016-4-27
	 * @version V_1.1 <br/>
	 */
	public static long getTimestamp(Date _date) {  
		long timestamp = 0l;
    	if(_date != null){
	        /*timestamp = "" + (DateUtil.getIntegerOfDate(_date, 1) + 1900) + DateUtil.getIntegerOfDate(_date, 2)  
	                	+ DateUtil.getIntegerOfDate(_date, 3) + DateUtil.getIntegerOfDate(_date, 5) + DateUtil.getIntegerOfDate(_date, 6)  
	                	+ _date.getTime();*/
    		timestamp = _date.getTime();
    	}
        return timestamp;  
    }

3. 定时用的时间戳可以归为第二类。我是用时间戳进行比较。下面附上代码。这一段是我获取年月日然后加上时间。把它转化为时间戳。然后用时间戳做比较。

     场景上:给两个时间节点,一个是开始年月日,一个是结束年月日。这段时间内每天1点-2点。针对数据库里面一条数据定时一个处理。2点-3点可能是另一个处理。表结构大概是这样的。startTime是开始时间点。endTime是结束时间点。而starthours和endhours是开始小时和结束小时。

     

for (TmTimeTask tmTimeTask : tmTimeTaskList) {
			String dateSatrtDay = dateDay+" "+tmTimeTask.getTimeTaskStartHours()+":00";
			String dateEndDay = dateDay+" "+tmTimeTask.getTimeTaskEndHours()+":00";
			long startTimeTemp = DateUtils.getTimestamp(DateUtils.stringToDate(dateSatrtDay));
			long endTimeTemp = DateUtils.getTimestamp(DateUtils.stringToDate(dateEndDay));
			
			if(nowTime>= startTimeTemp/1000 && nowTime < endTimeTemp/1000){
				try {
					tmPubTaskService.updateTaskIsHide(tmTimeTask.getTaskId(), tmTimeTask.getTaskOptId(), 1);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}else if(nowTime >= endTimeTemp/1000){
				try {
					tmPubTaskService.updateTaskIsHide(tmTimeTask.getTaskId(), tmTimeTask.getTaskOptId(), 0);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}


4 针对第四种可以使用时间戳的形式。在前台可以使用jQ来解析时间戳。这个是没事弄的一个方法。可以直接使用

(function($) {
  $.extend({
    myTime: {
      /**
       * 当前时间戳
       * @return <int>    unix时间戳(秒) 
       */
      CurTime: function(){
        return Date.parse(new Date())/1000;
      },
      /**       
       * 日期 转换为 Unix时间戳
       * @return <int>    unix时间戳(秒)       
       */
      DateToUnix: function(string) {
        var f = string.split(' ', 2);
        var d = (f[0] ? f[0] : '').split('-', 3);
        var t = (f[1] ? f[1] : '').split(':', 3);
        return (new Date(
            parseInt(d[0], 10) || null,
            (parseInt(d[1], 10) || 1) - 1,
            parseInt(d[2], 10) || null,
            parseInt(t[0], 10) || null,
            parseInt(t[1], 10) || null,
            parseInt(t[2], 10) || null
            )).getTime() / 1000;
      },
      /**       
       * 时间戳转换日期       
       * @param <int> unixTime  待时间戳(秒)       
       * @param <bool> isFull  返回完整时间(Y-m-d 或者 Y-m-d H:i:s)       
       * @param <int> timeZone  时区       
       */
      UnixToDate: function(unixTime, isFull, timeZone) {
        if (typeof (timeZone) == 'number')
        {
          unixTime = parseInt(unixTime) + parseInt(timeZone) * 60 * 60;
        }
        var time = new Date(unixTime * 1000);
        var ymdhis = "";
        ymdhis += time.getUTCFullYear() + "年";
        ymdhis += (time.getUTCMonth()+1) + "月";
        ymdhis += time.getUTCDate() + "日";
        if (isFull === true)
        {
          ymdhis += " " + time.getUTCHours() + ":";
          ymdhis += time.getUTCMinutes() + ":";
          ymdhis += time.getUTCSeconds();
        }
        return ymdhis;
      }
    }
  });
})(jQuery);

$.myTime.UnixToDate(jsonObj[i+1].pubCashCreatetime/1000  //调用格式,因为我的时间戳是毫秒级所以除以1000

以上是一般的对时间的筛选。还有一些需求是昨天/今天/明天。需要在天数+1或者月份+1或者年份+1的情况。这种情况应该与数据库无关。所以单独讲一下在java里面怎么处理

以某个日期为基准,计算其几天前/后、几年前/后,或者其他时间单位前后的日期
//根据现在时间计算
Calendar now = Calendar.getInstance(); 
now.add(Calendar.YEAR, 1); //现在时间的1年后
now.add(Calendar.YEAR, -1); //现在时间的1年前
//根据某个特定的时间 date (Date 型) 计算
Calendar specialDate = Calendar.getInstance();
specialDate.setTime(date); //注意在此处将 specialDate 的值改为特定日期
specialDate.add(Calendar.YEAR, 1); //特定时间的1年后
specialDate.add(Calendar.YEAR, -1); //特定时间的1年前

注意使用了 Calendar 对象的 add 方法,可以更改 Calendar.YEAR 为任意时间单位字段,完成各种时间单位下的日期计算。

计算两个时间的间隔,例如计算 2016 年 1 月 1 日距离现在有多少天。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = "2016-01-01 11:11:11";
Calendar calendar = Calendar.getInstance();
long nowDate = calendar.getTime().getTime(); //Date.getTime() 获得毫秒型日期
try {
       long specialDate = sdf.parse(dateString).getTime();
       long betweenDate = (specialDate - nowDate) / (1000 * 60 * 60 * 24); //计算间隔多少天,则除以毫秒到天的转换公式
        System.out.print(betweenDate);
} catch (ParseException e) {
         e.printStackTrace();
}
算出日期以后就可以做一些转化为时间戳或者转化为日期格式的字符串存入数据库。下面贴上我的一个dateUtil类。

/**
 * @Title  日期帮助类
 * @Package com.apache.liberty.util
 * @Description 日期帮助类
 * @author  <b>Liberty_G.  <a href="mailto:cry_dear@yeah.net">Liberty</a> cry_dear@yeah.net</b>
 * @date 创建时间:2016-4-22
 * @version V_1.0 <br/>
 * CopyRight: Gao. Copyright 2015-2020,  All rights reserved<br/>
 * Edit User: Liberty_G.<br/>
 * Edit Date: 2016-4-22 <br/>
 * EditContent:<br/>
 */
public class DateUtils {
	
	/**
	 * @Title 将日期转化为字符型
	 * @param _date 日期对象
	 * @param _formatString 需要格式化的日期类型    比如:"yyyy-MM-dd HH:mm:ss"或者"yyyy-MM-dd"
	 * @return <b>String</b> 转化的字符串结果
	 * @author Liberty_G.
	 * @date 2016-4-22
	 * @version V_1.0 <br/>
	 */
	public static String dateToString(Date _date, String _formatString){
		if(_date != null){
			SimpleDateFormat simpleDateFormat = new SimpleDateFormat(_formatString);
			return simpleDateFormat.format(_date);
		}else{
			return "";
		}
	}
	
	/**
	 * @Title 按照"yyyy-MM-dd HH:mm:ss"的格式,日期转化为字符串
	 * @param _date 日期对象
	 * @return <b>String</b> 转化的字符串结果
	 * @author Liberty_G.
	 * @date 2016-4-22
	 * @version V_1.0 <br/>
	 */
	public static String dataToString(Date _date){
		return dateToString(_date,"yyyy-MM-dd HH:mm:ss");
	}
	
	/**
	 * @Title 字符串转化为日期
	 * @param _dataString 需要转化的日期字符
	 * @param _formatDate 需要格式化日期的类型    比如:"yyyy-MM-dd HH:mm:ss"或者"yyyy-MM-dd"
	 * @return <b>Date</b> 日期类型
	 * @author Liberty_G.
	 * @date 2016-4-22
	 * @version V_1.0 <br/>
	 */
	public static Date stringToDate(String _dataString, String _formatDate){
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(_formatDate);
		
		Date date = null;
		
		try {
			date = simpleDateFormat.parse(_dataString);
		} catch (ParseException e) {
			System.out.println("Date format Exception The Reason\n"+ e.getMessage());
			e.printStackTrace();
		}
		return date;
	}
	
	/**
	 * @Title 按照"yyyy-MM-dd HH:mm:ss"的格式,字符串转化为日期
	 * @param _dataString 需要转化的日期字符
	 * @return <b>Date</b> 日期类型
	 * @author Liberty_G.
	 * @date 2016-4-22
	 * @version V_1.0 <br/>
	 */
	public static Date stringToDate(String _dataString){
		return stringToDate(_dataString,"yyyy-MM-dd HH:mm:ss");
	}
	
	
	/**
	 * @Title 获取日期中的某个值。如 获取年份/月份/日期
	 * @param _date 指定的日期对象
	 * @param _dateType 获取类型 1:年份/2:月份/3:日期/4:小时/5:分钟/6:秒/7:毫秒
	 * @return <b>int</b> 返回数值 年份/月份/日期
	 * @author Liberty_G.
	 * @date 2016-4-27
	 * @version V_1.1 <br/>
	 */
	public static int getIntegerOfDate(Date _date, int _dateType){
		int num = 0;  
        Calendar calendar = Calendar.getInstance();  
        
        switch (_dateType){
        case 0:
        	num = 0;
        	break;
        case 1:
        	num = calendar.get(Calendar.YEAR);
        	break;
        case 2:
        	num = calendar.get(Calendar.MONTH)+1;
        	break;
        case 3:
        	num = calendar.get(Calendar.DATE);
        	break;
        case 4:
        	num = calendar.get(Calendar.HOUR);
        	break;
        case 5:
        	num = calendar.get(Calendar.MINUTE);
        	break;
        case 6:
        	num = calendar.get(Calendar.SECOND);
        	break;
        case 7:
        	num = calendar.get(Calendar.MILLISECOND);
        	break;
        }
        return num;
	}

	/**
	 * @Title 判断字符串是否是日期
	 * @param _date 指定的字符串
	 * @return <b>boolean</b> 返回真假
	 * @author Liberty_G.
	 * @date 2016-6-27
	 * @version V_1.1 <br/>
	 */
	public static boolean isDate(String _date){
		boolean isDate = false;
		if(_date != null && !_date.equals("")){
			if(stringToDate(_date)!= null){
				isDate = true;
			}
		}
		return isDate;
	}
	
	/**
	 * @Title 获取日期的星期
	 * @param _date 指定的日期对象
	 * @return <b>WeekEnum</b> 枚举星期对象
	 * @author Liberty_G.
	 * @date 2016-4-27
	 * @version V_1.1 <br/>
	 */
	public static WeekEnum getWeek(Date _date) {  
		WeekEnum week = null;  
        Calendar calendar = Calendar.getInstance();  
        calendar.setTime(_date);  
        int weekNumber = calendar.get(Calendar.DAY_OF_WEEK) - 1;  
        switch (weekNumber) {  
        case 0:  
            week = WeekEnum.SUNDAY;  
            break;  
        case 1:  
            week = WeekEnum.MONDAY;  
            break;  
        case 2:  
            week = WeekEnum.TUESDAY;  
            break;  
        case 3:  
            week = WeekEnum.WEDNESDAY;  
            break;  
        case 4:  
            week = WeekEnum.THURSDAY;  
            break;  
        case 5:  
            week = WeekEnum.FRIDAY;  
            break;  
        case 6:  
            week = WeekEnum.SATURDAY;  
            break;  
        }  
        return week;  
    }
	
	/**
	 * @Title 获取两个日期相差的天数
	 * @param _date 指定的日期对象
	 * @param _otherDate 指定的日期对象
	 * @return <b>int</b> 返回两个日期相差的天数 如果失败 返回-1
	 * @author Liberty_G.
	 * @date 2016-4-27
	 * @version V_1.1 <br/>
	 */
	public static int getIntervalDays(String _date, String _otherDate) {  
        return getIntervalDays(stringToDate(_date), stringToDate(_otherDate));  
    }  
	
	/**
	 * @Title 获取两个日期相差的天数
	 * @param _date 指定的日期对象
	 * @param _otherDate 指定的日期对象
	 * @return <b>int</b> 返回的相差的天数 如果失败返回-1
	 * @author Liberty_G.
	 * @date 2016-4-27
	 * @version V_1.1 <br/>
	 */ 
    public static int getIntervalDays(Date _date, Date _otherDate) {  
        int num = -1;  
        Date dateTmp = DateUtils.stringToDate(DateUtils.dataToString(_date), "yyyy-MM-dd");  
        Date otherDateTmp = DateUtils.stringToDate(DateUtils.dataToString(_otherDate), "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;  
    } 

    /**
	 * @Title 获取指定日期时间戳
	 * @param _date 指定的日期对象
	 * @return <b>String</b> 返回时间戳 如果失败 返回空
	 * @author Liberty_G.
	 * @date 2016-4-27
	 * @version V_1.1 <br/>
	 */
	public static long getTimestamp(Date _date) {  
		long timestamp = 0l;
    	if(_date != null){
	        /*timestamp = "" + (DateUtil.getIntegerOfDate(_date, 1) + 1900) + DateUtil.getIntegerOfDate(_date, 2)  
	                	+ DateUtil.getIntegerOfDate(_date, 3) + DateUtil.getIntegerOfDate(_date, 5) + DateUtil.getIntegerOfDate(_date, 6)  
	                	+ _date.getTime();*/
    		timestamp = _date.getTime();
    	}
        return timestamp;  
    }
    
    /**
   	 * @Title 获取当前日期时间戳
   	 * @return <b>String</b> 返回时间戳 如果失败 返回空
   	 * @author Liberty_G.
   	 * @date 2016-4-27
   	 * @version V_1.1 <br/>
   	 */
    public static long getTimestamp() {
    	Date date = new Date();
    	return getTimestamp(date);
    }

    /**
   	 * @Title 判断是否是闰年
   	 * @param _yeah 指定的年对象
   	 * @return <b>boolean</b> 返回'假'则是平年 返回'真'则是闰年
   	 * @author Liberty_G.
   	 * @date 2016-4-27
   	 * @version V_1.1 <br/>
   	 */
    public static boolean isLeapyear(int _year) {  
        if ((_year % 4 == 0 && _year % 100 != 0) || (_year % 400) == 0) {  
            return true;  
        } else {  
            return false;  
        }  
    }  

    /**
   	 * @Title 判断是否是闰年
   	 * @param _date 指定的日期对象
   	 * @return <b>boolean</b> 返回'假'则是平年 返回'真'则是闰年
   	 * @author Liberty_G.
   	 * @date 2016-4-27
   	 * @version V_1.1 <br/>
   	 */
    public static boolean isLeapyear(Date _date) {  
    	return isLeapyear(DateUtils.getIntegerOfDate(_date, 1) + 1900);
    }
    
    /**
   	 * @Title 返回指定年份中指定月数的天数
   	 * @param _date 指定的年数对象
   	 * @param _month 指定的月数对象
   	 * @return <b>String</b> 返回指定年份中指定月数的天数
   	 * @author Liberty_G.
   	 * @date 2016-4-27
   	 * @version V_1.1 <br/>
   	 */
    public static String getMonthLastDay(int _year, int _month) {  
        int[][] day = { { 0, 30, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },  
                		{ 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } };  
        if (_year % 4 == 0 && _year % 100 != 0 || _year % 400 == 0) {  
            return day[1][_month] + "";  
        } else {  
            return day[0][_month] + "";  
        }  
    } 
}
/**
 * @Title  星期枚举值 如 "星期一", "Monday", "Mon.", 1
 * @Package com.apache.liberty.util
 * @Description 星期枚举值
 * @author  <b>Liberty_G.  <a href="mailto:cry_dear@yeah.net">Liberty</a> cry_dear@yeah.net</b>
 * @date 创建时间:2016-4-22
 * @version V_1.0 <br/>
 * CopyRight: Gao. Copyright 2015-2020,  All rights reserved<br/>
 * Edit User: Liberty_G.<br/>
 * Edit Date: 2016-6-27 <br/>
 * EditContent:<br/>
 */
public enum WeekEnum {
	
	/**
	 * @Title 星期一枚举值变量
	 * @author Liberty_G.
	 * @date 2016-6-27
	 * @version V_1.0 <br/>
	 */
	MONDAY("星期一", "Monday", "Mon.", 1),
	
	/**
	 * @Title 星期二枚举值变量
	 * @author Liberty_G.
	 * @date 2016-6-27
	 * @version V_1.0 <br/>
	 */
    TUESDAY("星期二", "Tuesday", "Tues.", 2),
    
    /**
	 * @Title 星期三枚举值变量
	 * @author Liberty_G.
	 * @date 2016-6-27
	 * @version V_1.0 <br/>
	 */
    WEDNESDAY("星期三", "Wednesday", "Wed.", 3),
    
    /**
	 * @Title 星期四枚举值变量
	 * @author Liberty_G.
	 * @date 2016-6-27
	 * @version V_1.0 <br/>
	 */
    THURSDAY("星期四", "Thursday", "Thur.", 4),
    
    /**
	 * @Title 星期五枚举值变量
	 * @author Liberty_G.
	 * @date 2016-6-27
	 * @version V_1.0 <br/>
	 */
    FRIDAY("星期五", "Friday", "Fri.", 5), 
    
    /**
	 * @Title 星期六枚举值变量
	 * @author Liberty_G.
	 * @date 2016-6-27
	 * @version V_1.0 <br/>
	 */
    SATURDAY("星期六", "Saturday", "Sat.", 6),
    
    /**
	 * @Title 星期日枚举值变量
	 * @author Liberty_G.
	 * @date 2016-6-27
	 * @version V_1.0 <br/>
	 */
    SUNDAY("星期日", "Sunday", "Sun.", 7);  
      
    String name_cn;  
    String name_en;  
    String name_enShort;  
    int number;
      
    WeekEnum(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;  
    }  
    
    /**
	 * @Title 获取中文星期
	 * @return <b>String</b> 中文星期
	 * @author Liberty_G.
	 * @date 2016-6-27
	 * @version V_1.0 <br/>
	 */
    public String getChineseName() {  
        return name_cn;  
    }  
  
    /**
   	 * @Title 获取英文星期
   	 * @return <b>String</b> 英文星期
   	 * @author Liberty_G.
   	 * @date 2016-6-27
   	 * @version V_1.0 <br/>
   	 */
    public String getName() {  
        return name_en;  
    }  
  
    /**
   	 * @Title 获取星期缩写
   	 * @return <b>String</b> 星期缩写
   	 * @author Liberty_G.
   	 * @date 2016-6-27
   	 * @version V_1.0 <br/>
   	 */
    public String getShortName() {  
        return name_enShort;  
    }  
  
    /**
   	 * @Title 获取星期数字
   	 * @return <b>String</b> 星期数字
   	 * @author Liberty_G.
   	 * @date 2016-6-27
   	 * @version V_1.0 <br/>
   	 */
    public int getNumber() {  
        return number;  
    }  
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值