Press "Enter" to skip to content

分类: 技术宅

JAVA计算两个日期之间相差的天数

在Java开发物流或是其他功能的时候会用到两个日期相差多天的数据,所以整理了一下备用。

调用方式:

long date1 = getDateTime("20121201");//可改成自己的日期类型,但以“20121212”这种格式
long date2 = getDateTime("20121212");  
int day = dateInterval(date1, date2);  
System.out.println(day); 

输出:11

具体实现方法调用:

    /** 
     * 计算出两个日期之间相差的天数 
     * 建议date1 大于 date2 这样计算的值为正数 
     * @param date1 日期1 
     * @param date2 日期2 
     * @return date1 - date2 
     */  
    public static int dateInterval(long date1, long date2) {
        if(date2 > date1){
            date2 = date2 + date1;
            date1 = date2 - date1;
            date2 = date2 - date1;
        }
 
         // Canlendar 该类是一个抽象类  
         // 提供了丰富的日历字段 
         // 本程序中使用到了 
         // Calendar.YEAR    日期中的年份 
         // Calendar.DAY_OF_YEAR     当前年中的天数 
         // getActualMaximum(Calendar.DAY_OF_YEAR) 返回今年是 365 天还是366天 
        Calendar calendar1 = Calendar.getInstance(); // 获得一个日历  
        calendar1.setTimeInMillis(date1); // 用给定的 long 值设置此 Calendar 的当前时间值。  
          
        Calendar calendar2 = Calendar.getInstance();
        calendar2.setTimeInMillis(date2);
        // 先判断是否同年  
        int y1 = calendar1.get(Calendar.YEAR);
        int y2 = calendar2.get(Calendar.YEAR);
          
        int d1 = calendar1.get(Calendar.DAY_OF_YEAR);
        int d2 = calendar2.get(Calendar.DAY_OF_YEAR);
        int maxDays = 0;
        int day = 0;
        if(y1 - y2 > 0){
            day = numerical(maxDays, d1, d2, y1, y2, calendar2);
        }else{
            day = d1 - d2;
        }
        return day;
    }  
      
    /** 
     * 日期间隔计算 
     * 计算公式(示例): 
     *      20121201- 20121212
     *      取出20121201这一年过了多少天 d1 = 天数  取出20121212这一年过了多少天 d2 = 天数
     *      如果2012年这一年有366天就要让间隔的天数+1,因为2月份有29日。 
     * @param maxDays   用于记录一年中有365天还是366天 
     * @param d1    表示在这年中过了多少天 
     * @param d2    表示在这年中过了多少天 
     * @param y1    当前为2012年 
     * @param y2    当前为2012年 
     * @param calendar  根据日历对象来获取一年中有多少天 
     * @return  计算后日期间隔的天数 
     */  
    public static int numerical(int maxDays, int d1, int d2, int y1, int y2, Calendar calendar){
        int day = d1 - d2;
        int betweenYears = y1 - y2;
        List<Integer> d366 = new ArrayList<Integer>();
          
        if(calendar.getActualMaximum(Calendar.DAY_OF_YEAR) == 366){
            System.out.println(calendar.getActualMaximum(Calendar.DAY_OF_YEAR));
            day += 1;
        }
          
        for (int i = 0; i < betweenYears; i++) {
            // 当年 + 1 设置下一年中有多少天  
            calendar.set(Calendar.YEAR, (calendar.get(Calendar.YEAR)) + 1);
            maxDays = calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
            // 第一个 366 天不用 + 1 将所有366记录,先不进行加入然后再少加一个  
            if(maxDays != 366){
                day += maxDays;
            }else{
                d366.add(maxDays);
            }
            // 如果最后一个 maxDays 等于366 day - 1  
            if(i == betweenYears-1 && betweenYears > 1 && maxDays == 366){
                day -= 1;
            }
        }
          
        for(int i = 0; i < d366.size(); i++){
            // 一个或一个以上的366天  
            if(d366.size() >= 1){
                day += d366.get(i);
            } 
        }  
        return day;
    }
      
    /** 
     * 将日期字符串装换成日期 
     * @param strDate   日期支持年月日 示例:yyyyMMdd 
     * @return  1970年1月1日器日期的毫秒数 
     */  
    public static long getDateTime(String strDate) {
        return getDateByFormat(strDate, "yyyyMMdd").getTime();
    }
      
    /** 
     * @param strDate   日期字符串 
     * @param format    日期格式 
     * @return      Date 
     */  
    public static Date getDateByFormat(String strDate, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        try{
            return (sdf.parse(strDate));
        }catch (Exception e){
            return null;
        }
    }
Leave a Comment

Mac截图快捷键

1)Command-Shift-3: 将整个屏幕拍下并保存到桌面。

2)Command-Shift-Control-3:将整个屏幕拍下并保存到剪贴板(Clipboard),然后Command+V直接粘贴到如Photoshop,ppt等软件中编辑。

3)Command-Shift-4:将屏幕的一部分拍下并保存到桌面。按下这个组合键后,光标会变为一个十字,你可以拖拉来选取拍摄区域。

4)Command-Shift-Control-4:将屏幕的一部分拍下并保存到剪贴板。

5)Command-Shift-4再按空格键:这时光标会变为一个照相机图标,点击可拍下当前窗口或菜单或Dock以及图标等,只要将照相机图标移动到不同区域(有效区域会显示为浅蓝色)点击。

6)Command-Shift-Control-4再按空格键:将选取的窗口或其他区域的快照保存到剪贴板。

Leave a Comment

Eclipse支持视网膜屏Retina配置方法

在Eclipse.app上点击右键 选择“显示包内容” 然后打开Contents文件夹 编辑 Info.plist
在底部添加蓝色文字

<key>NSHighResolutionCapable</key>
<true/>
</dict>
</plist>

添加完成后保存文件后,注销系统,或是复制粘贴一下Eclipse.app 然后删掉原来那个.app

好了,高清的Eclipse就展现在眼前了。

Leave a Comment

Java MD5生成数据实现

常用的JAVA MD5实现方法。

调用 MD5(“123456”)
返回:e10adc3949ba59abbe56e057f20f883e

	/**
	 * 字符串数据进行MD5算法加密
	 */
	public static String MD5(String s) {
		String resultStr = null;

		try {
			byte[] source = s.getBytes("UTF-8");
			char hexDigits[] = { // 用来将字节转换成 16 进制表示的字符
			'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c','d', 'e', 'f' };
			java.security.MessageDigest md = java.security.MessageDigest
					.getInstance("MD5");
			md.update(source);
			byte tmp[] = md.digest(); // MD5 的计算结果是一个 128 位的长整数,
										// 用字节表示就是 16 个字节
			char str[] = new char[16 * 2]; // 每个字节用 16 进制表示的话,使用两个字符,
											// 所以表示成 16 进制需要 32 个字符
			int k = 0; // 表示转换结果中对应的字符位置
			for (int i = 0; i < 16; i++) { // 从第一个字节开始,对 MD5 的每一个字节
											// 转换成 16 进制字符的转换
				byte byte0 = tmp[i]; // 取第 i 个字节
				str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高 4 位的数字转换,
															// >>>
															// 为逻辑右移,将符号位一起右移
				str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换
			}
			resultStr = new String(str); // 换后的结果转换为字符串

		} catch (Exception e) {
			e.printStackTrace();
		}
		return resultStr;
	}
Leave a Comment

解决MacBook Pro视网膜屏下Office 2011更新后模糊解决办法

首选下载微软的最新更新补丁Offcie 2011 V14.2.4
更新完成后,在Terminal下分别输入以下四条命令

sudo touch /Applications/Microsoft\ Office\ 2011/Microsoft\ Excel.app
sudo touch /Applications/Microsoft\ Office\ 2011/Microsoft\ PowerPoint.app/
sudo touch /Applications/Microsoft\ Office\ 2011/Microsoft\ Word.app/
sudo touch /Applications/Microsoft\ Office\ 2011/Microsoft\ Outlook.app/

再次打开Office的Word及其它几个看看是否高清了。

以下是我的操作,需要输入管理员密码执行

kiccleafmatoMacBook-Pro:~ kiccleaf$ sudo touch /Applications/Microsoft\ Office\ 2011/Microsoft\ Excel.app
Password:
kiccleafmatoMacBook-Pro:~ kiccleaf$ sudo touch /Applications/Microsoft\ Office\ 2011/Microsoft\ PowerPoint.app/
kiccleafmatoMacBook-Pro:~ kiccleaf$ sudo touch /Applications/Microsoft\ Office\ 2011/Microsoft\ Word.app/
kiccleafmatoMacBook-Pro:~ kiccleaf$ sudo touch /Applications/Microsoft\ Office\ 2011/Microsoft\ Outlook.app/

看看效果

Leave a Comment

最新synergy配置多台电脑间共享一套鼠标键盘

Synergy 是一个可以多台电脑之间共享鼠标键盘的软件.因为电脑很多,被多个鼠标键盘搞得手忙脚乱的朋友有福了.利用这个软件可以实现多屏同时操作的功能.除了窗口不能跨屏幕外,剪贴板,鼠标,键盘都能很好地共享,而且这个软件支持 Linux, Windows 和Mac.我的工作环境有二台电脑,经常为多个键盘烦恼.这下可以很方便操作了.
我的环境:Win2008+Win7 都是x64位的,所以下载的时候选择了最新版本

官方介绍:
Synergy允许您轻松地分享你的鼠标和键盘之间 你的办公桌上多台计算机,它的自由和开放源码。 只要你的鼠标移出一台计算机的屏幕边缘 另一个。你甚至可以分享您的剪贴板。所有你需要的 是一个网络连接。 Synergy是跨平台(工程 在Windows,Mac OS X和Linux)。

微软Windows
1.4.7的Beta版本: 32位,64位
1.3.8稳定版本: 32位, 64位

下载地址:http://synergy-foss.org/zh/xiazai/

主控端配置界面:

主控端添加被控端配置:

被控端配置界面:

Leave a Comment

JS实现儒略日的计算

在网络上有各种各样的计算方法,相对来讲都是接近但不准确,所以自己动手修改了一下,其实也就是简单的计算,把小时,分钟,秒这些去掉。计算出来的结果就相对于符合了。

现在的公历起源于埃及历,由古罗马的恺撒在公元前46年制定的,365日作为一年,单月为大月31天,双月为小月30天,4年一闰,称为“儒略历”或“恺撒历”。1582年罗马教皇格里高利十三世(Gregorius XⅢ)对“儒略历”又进行修改,规定被4整除的年为闰年,但逢百之年只有能被400除尽才能是闰年。这就是使用至今的“格里历”。教皇于1582年10月4日还下令将次日(即原10月5日)定为10月15日,把春分日又恢复为3月21日。

儒略日(Julian day,JD)是由法国学者 Joseph Justus Scaliger(1540-1609)发明的,是天文学上不用一种不用年、月的长期纪日法,用它可以很方便地计算到两时间点间以天数计量的时间间隔。儒略日以公元前4713年儒略历1月1日格林威治平午为起算日期,以7980年为一个周期,每天顺数而下,流水计日。儒略日的这种计算方法相当方便,获得了天文界内的一致采用,是天文计算中最为重要的计算基准。

例如:JD=245 191 9.34230,它意味着距儒略周期的开始已经逝去了2451919天。而小数点后的“.34230”代表这天的时间(“15:12:54 EST”),在天体位置计算中是最具信息量的数据。再比如世界时公元2009年3月1号的儒略日是2454891.8333333335天。

注意,”儒略日(julian Day)” 与”儒略历(Julian Calendar)”指的不是同一概念。

由于儒略日的表达数值太长,需要7位数字表示天数,因此,后来又出现了一种约化儒略日(Modified Julian Day,MJD)的记法,MJD = JD – 2,400,000.5,即约化儒略日的起算点在1858年11月16日平午。之所以采用约化儒略日的表达方法,主要有一下2个方面的考虑:

1.日期天数的计算往往习惯以午夜时分起算,而不是正午。
2.在1859至2130年之间,只需要5位数字来表示日期就够了,而不需要全部的7位数字

因此MJD 0就等于JD 2400000.5。对于计算机来说,MJD也意味着更少的存储单元

JS脚本代码

<script>
	var now = new Date();
    var month = now.getUTCMonth() + 1;
    var day = now.getUTCDate();
    var year = now.getUTCFullYear();

function computes()   
{
	var y = eval(year);
	var m = eval(month);
	var d = eval(day);


	var extra = 100.0*y + m - 190002.5;
	var rjd = 367.0*y;
	rjd -= Math.floor(7.0*(y+Math.floor((m+9.0)/12.0))/4.0);
	rjd += Math.floor(275.0*m/9.0);
	rjd += d;

	rjd += 1721013.5;
	rjd -= 0.5*extra/Math.abs(extra);
	rjd += 0.5;
	form.results.value = rjd;
}
</script>
<form name="form" id="form">

<input text="text" name="results" id="results">
</form>
<script>
computes();
</script>

Leave a Comment

TSQL 数据库某字段内容批量替换

由于数据库中存在某个字段某些内容,需要整体替换,如http://www.kiccleaf.com 替换成http://www.qimutian.com 这样的方法,如果程序跑,那是要先读取出来,然后替换后再写入回去。麻烦。
保险点操作先看看select 替换结果:
其实只要替换kiccleaf为qimutian就好了。

select REPLACE(URL,'kiccleaf','qimutian')  from Tables

实际更新语句

update Tables set URL=REPLACE(URL,'kiccleaf','qimutian')

总结:批量替换,速度超级快!工作量省不少。

Leave a Comment

TSQL 字段与字符拼接及大小写转换

有时候,我们在操作数据库时会有很多很细小的应用例如:
1.把字段中的大小全转换成小字字母,或是相反。
2.需要某个字段进行拼接一个字符出来。
我在实际应用中发现,MSSQL和Mysql的语法不同。

1.大小写转换
把表tables中的word字段转换成大写或是小字字母操作

--转换成小字字母
update tables set word=lower(word)

--转换成大写字母

update tables set word=upper(word)

2.Mysql的操作字段和字符拼接语句concat函数

select concat(字段, '拼接字符串') from 表名;
如:
select concat(`word`, '.mp3') from tables;

把字段word内容如a的,拼接出如a.mp3

MSSQL就比较方便了直接采用+就可以把字段和字符串进行拼接

select word+'.mp3' from tables
Leave a Comment

HTC G7体验总结及取消屏锁操作

对于G7这款手机体验近一年的总结

不足的地方有:

1.自带的使用容量不足,每次提示空间不足不能安装软件,但外带的容量有8G
2.屏幕在打电话时靠近脸就会变黑,然后要等很久才恢复,听说是感应器坏了,那怎么脸一贴近就能感应呢?
3.开启无线或是玩个游戏,电池支持不了多久,基本几小时玩游戏或是无线开着一天就没有电了。
4.经常出现一些软件假死,或是无响应。

由于每次操作都比较麻烦,所以直接取消操作。但发现第一次操作时,根本不知道怎么取消,所以研究了一下,提供以下方法与大家分享!

“设置”–“安全”里边,看“设置屏幕锁定”,先输入密码或者手势图案,然后看到一个菜单“无 (停用屏幕解锁保护)”就可以设置取消了。


点击-更改屏幕锁定


输入原来设定的图片密码


点停用屏幕解锁保护


恢复到原来状态

Leave a Comment