静以修心

2012年4月4日

本来以为有了date4j就万事无休了,结果在工作的时候发觉有不少脚步仅仅需要两三个简单的class执行一下就可以完成任务了。也就是说即使是date4j,相对于这两三个甚至是一个class来说还是过于臃肿了。于是乎自己写了个简单的日期封装类。
主要功能是
1.获取当前时间
2.获取当前年,月,日,时,分,秒
3.获取指定日期的年,月,日,时,分,秒
4.获取两个日期的时间差(包括年月日时分秒)
5.将字符窜类型转成java.util.date类型
6.指定日期添加时间

package com.kohri.date;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * @descriped a simple class for date
 * 
@author Kohri
 * @date 2012/4/22
 * 
@version 1.0
 
*/
public class SimpleDate {

    private static String defaultFormat = "yyyy-MM-dd HH:mm:ss";
    private static SimpleDateFormat sf = null ;
    private static Calendar cal = Calendar.getInstance();
    private static Date date = null;

    /**
     * get current date time (default 'yyyy-MM-dd HH:mm:ss')
     * 
@return string
     
*/
    public static String getDateNow() {
        sf = new SimpleDateFormat(defaultFormat);
        String currentTime = "";
        currentTime = sf.format(new Date());
        return currentTime;
    }
    
    /**
     * get year (default now) 
     * 
@return int 
     
*/
    public static int getYear(){
        int currentYear = cal.get(Calendar.YEAR);
        return currentYear;
    }
    
    /**
     * get mon (default now) 
     * 
@return int 
     
*/
    public static int getMonth(){
        int currentMonth = cal.get(Calendar.MONTH) + 1;
        return currentMonth;
    }
    
    /**
     * get day of month (default now)
     * 
@return int 
     
*/
    public static int getDay(){
        int currentDayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
        return currentDayOfMonth;
    }
    
    /**
     * get hours (default now)
     * 
@return int 
     
*/
    public static int getHours(){
        int currentHours = cal.get(Calendar.HOUR_OF_DAY);
        return currentHours;
    }
    
    /**
     * get  minutes (default now)
     * 
@return int 
     
*/
    public static int getMinutes(){
        int currentMinute = cal.get(Calendar.MINUTE);
        return currentMinute;
    }

    /**
     * get seconds (default now)
     * 
@return int 
     
*/
    public static int getSeconds(){
        int currentSecond = cal.get(Calendar.SECOND);
        return currentSecond;
    }
    
    /**
     * string change to date
     * 
@param strDate
     * 
@param dateFormat
     * 
@return date
     
*/
    public static Date toDate(String strDate, String dateFormat){
        if(strDate == null || strDate.length() == 0){
            return null;
        }
        Date date = null;
        DateFormat df = new SimpleDateFormat(dateFormat);
        try {
            date = df.parse(strDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
    
    /**
     * Returns this Calendar's time value in milliseconds
     * 
@param p_date
     * 
@return long
     
*/
    public static long getMillisOfDate(Date date) {
           cal.setTime(date);
           return cal.getTimeInMillis();
    }
    
    
    
    /**
     * compare two date 
     * return the greater date 
     * if equals return null
     * 
@param strStartDate
     * 
@param strEndDate
     * 
@return date 
     
*/
    public static Date getGreaterDate(String strStartDate, String strEndDate){
        Date date = null;
        Date startDate = toDate(strStartDate, "yyyy-MM-dd");
        Date endDate = toDate(strEndDate, "yyyy-MM-dd");
        long startTime = getMillisOfDate(startDate);
        long endTime = getMillisOfDate(endDate);
        if((startTime - endTime) > 0){
            return startDate;
        }else if((endTime - startTime) > 0){
            return endDate;
        }
        return date;
    }
    
    /**
     * get days between 2 different date
     * 
@param strStartDate less date (yyyy-MM-dd)
     * 
@param strEndDate greater date (yyyy-MM-dd)
     * 
@return long
     
*/
    public static long getDaysOftwoDiffDate(String strStartDate, String strEndDate){
           Date startDate = toDate(strStartDate, "yyyy-MM-dd");
           Date endDate = toDate(strEndDate, "yyyy-MM-dd");
           long startTime = getMillisOfDate(startDate);
           long endTime = getMillisOfDate(endDate);
           long betweenDays = (long) ((endTime - startTime) / ( 1000 * 60 * 60 * 24 ));
           return betweenDays;
    }
    
    /**
     * get weeks between 2 different date
     * 
@param strStartDate less date (yyyy-MM-dd)
     * 
@param strEndDate greater date (yyyy-MM-dd)
     * 
@return long
     
*/
    public static long getWeeksOfTwoDiffDate(String strStartDate, String strEndDate){
        return getDaysOftwoDiffDate(strStartDate, strEndDate) / 7;
    }
    
    /**
     * get months between 2 different date
     * 
@param strStartDate less date (yyyy-MM-dd)
     * 
@param strEndDate greater date (yyyy-MM-dd)
     * 
@return long
     
*/
    public static long getMonthsOfTwoDiffDate(String strStartDate, String strEndDate){
        return getDaysOftwoDiffDate(strStartDate, strEndDate) / 30;
    }
    
    /**
     * get years between 2 different date
     * 
@param strStartDate less date (yyyy-MM-dd)
     * 
@param strEndDate greater date (yyyy-MM-dd)
     * 
@return long
     
*/
    public static long getYearsOfTwoDiffDate(String strStartDate, String strEndDate){
        return getDaysOftwoDiffDate(strStartDate, strEndDate) / 365;
    }
    
    /**
     * add date
     * 
@param date
     * 
@param count 
     * 
@param field Calendar.YEAR(MONTH..)
     * 
@param format DateFormat(yyyy-MM-dd)
     * 
@return string
     
*/
    public static String addDate(Date date,int count,int field,String format){
           cal.setTime(date);
           int year = getYear();
           int month = getMonth() - 1;
           int day = getDay();
           int hours = getHours();
           int minutes = getMinutes();
           int seconds = getSeconds();
           Calendar calendar = new GregorianCalendar(year, month, day, hours, minutes, seconds);
           calendar.add(field,count);
           DateFormat df = new SimpleDateFormat(format);
           String tmpDate = df.format(calendar.getTime());
           if(date == null){
cal.setTime(new Date());
}else{
cal.setTime(date);
}
           return tmpDate;
    }
    
    /**
     * calendar settime
     * 
@param date
     
*/
    private static void setCalTime(Date date){
        if(date != null){
            cal.setTime(date);
        }
    }
    
    //setter getter

    public static String getDefaultFormat() {
        return defaultFormat;
    }

    public static void setDefaultFormat(String defaultFormat) {
        SimpleDate.defaultFormat = defaultFormat;
    }

    public static Date getDate() {
        return date;
    }

    public static void setDate(Date date) {
        SimpleDate.date = date;
        setCalTime(date);
    }
    

}
posted @ 2012-04-25 22:36 kohri 阅读(1927) | 评论 (1)编辑 收藏

      在熟悉公司业务代码的时候经常看见有日期处理(date),由于项目转手次数较多,在这方面没合理封装处理好,于是就想自己封装一个date类。然而辗转了几天却发觉已经有date4j的存在,于是在这里简单地介绍一下这个日期类库。以下包括自己的代码、网上流传资料、以及date4j官网例子。

-------------------------------------------------------------------------------------------------------------------------------------------------------------

java日期处理相关类:

java.util.Date 
java.sql.Date 
java.sql.Time 
java.sql.Timestamp 
java.util.Calendar 
java.util.TimeZone

     比较常用的是java.util.date,将java.util.Date转为java.sql.Date的时候,日期时分秒会被去掉,失去精度。而且如果现在翻开api看看就发觉这两个类好多方法已经过时,几近沦为废物。

     Timestamp能和java.util.date无损转换,但是在一些预定义sql中会常常出问题。

(以上出自 click me

--------------------------------------------------------------------------------------------------------------------------------------------------------------

Java本身的日期类在JDK1.0版本之后就再也没有更新过,同时还存在着一些众所周知的问题(例如1月从0开始,导致了很多月份差一的漏洞)。一份新的Java规范请求(JSR,Java Specification Request)已经被提交,目的就是要解决上述问题,此版本的类库仍处在Alpha版本。在其稳定之前,很多开发者还是会使用Joda Time类库,该类库与JSR-310的参考实现类似(但不完全相同)。 Date4j为在Java中处理日期提供了一套新的解决方案,但与Joda Time所关注的范围完全不同。对比如下:

Joda TimeDate4j
拥有的类的数量: 140+ 拥有的类的数量< 10
包含可变和不可变类 仅包含不可变类
强调速度和功能 强调简单和有效
支持格里高里历(Gregorian)、 科普特语日历(Coptic)、 伊斯兰教历(Islamic)、佛历(Buddhist)等等 只提供对格里高里历的支持
可以完全取代JDK日期类 和JDK日期类配合使用
精确到毫秒级操作 支持到纳秒(十亿分之一秒)级操作
修复了天“溢出”的问题 天“溢出”的问题可配置
针对的是通常意义的日期维护 适用于通过数据库来维护的日期
采用Apache 2.0授权许可 采用BSD授权许可

虽然乍一看Date4j只具备了Joda中一部分的特性,但它有两个主要的特点是Joda所不具备的。

首先,Date4j的开发者宣称类库不应莫名其妙地将日期截断。Joda只支持毫秒级的精度而且在将来可能也不会改善。一些数据库也已经有了更好的解决方案。比如流行的PostgreSQL数据库对时间戳精度就已经支持到微秒级(百万分之一秒)。Date4j可在处理日期时对精度毫无损伤。

第二个特征是日期“溢出”的问题,例如向某个日期增加一段时间后,日期落在下月的情况。最简单的例子就是在3月31日增加一个月的计算:

DateTime dt = new DateTime("2011-03-31"); 
DateTime result = dt.plusMonths(1); (最新版本此方法应该已经被删除,只有plus(...)与plusDay())
System.out.println(result.toString());

当使用Joda Time时,会输出4月30日,但这也许并不是你想要的结果。

鉴于这种不确定性,Date4j为您提供了4种选择

1. 第一天
2. 最后一天(与Joda Time相同)
3. 日期顺延
4. 抛出异常

以上转自 click me
-----------------------------------------------------------------------------------------------------------------------------------------------------------

date4j官网&&实例:


import hirondelle.date4j.DateTime;
import hirondelle.date4j.DateTime.DayOverflow;

import java.util.TimeZone;

public class Date4jExamples {

    public static void main(String[] args) {
        Date4jExamples examples = new Date4jExamples();
        examples.currentDateTime();
        examples.ageIfBornOnCertainDate();
        examples.daysTillChristmas();
        examples.whenIs90DaysFromToday();
        examples.dateDifference();
        examples.whenIs3Months5DaysFromToday();
        examples.hoursDifferenceBetweenParisAndPerth();
        examples.weeksSinceStart();
        examples.timeTillMidnight();
        examples.imitateISOFormat();
        examples.firstDayOfThisWeek();
        examples.jdkDatesSuctorial();

    }

    private static void log(Object aMsg) {
        System.out.println(String.valueOf(aMsg));
    }

    /**   
     * 获取当前时间 what is the current date-time in the JRE's default time zone
     * ------------------------------------------------------------------------
     * Here are some practical examples of using the above formatting symbols:
     *
     *    Format                                  Output
     *    YYYY-MM-DD hh:mm:ss.fffffffff a     1958-04-09 03:05:06.123456789 AM
     *    YYYY-MM-DD hh:mm:ss.fff a             1958-04-09 03:05:06.123 AM
     *    YYYY-MM-DD                             1958-04-09
     *    hh:mm:ss.fffffffff                     03:05:06.123456789
     *    hh:mm:ss                             03:05:06
     *    YYYY-M-D h:m:s                         1958-4-9 3:5:6
     *    WWWW, MMMM D, YYYY                     Wednesday, April 9, 1958
     *    WWWW, MMMM D, YYYY |at| D a         Wednesday, April 9, 1958 at 3 AM
     *
     *----------------------------------------------------------------------
     * ---
    private void currentDateTime() {
        DateTime now = DateTime.now(TimeZone.getDefault());
        String result = now.format("YYYY-MM-DD hh:mm:ss");
        log("Current date-time in default time zone : " + result);
        // result Current date-time in default time zone : 2012-04-12 00:55:54
    }

    /**
     * 年龄计算 what's the age of someone born may 16,1995
     
*/
    private void ageIfBornOnCertainDate() {
        DateTime today = DateTime.today(TimeZone.getDefault());
        DateTime birthdate = DateTime.forDateOnly(1995, 5, 16);
        int age = today.getYear() - birthdate.getYear();
        // getDayOfYear获取距离年初的总天数
        if (today.getDayOfYear() < birthdate.getDayOfYear()) {
            age = age - 1;
        }
        log("Age of someone born May 16, 1995 is : " + age);
        // result Age of someone born May 16, 1995 is : 16
    }

    /**
     * 日期相距 How many days till the next December 25
     
*/
    private void daysTillChristmas() {
        DateTime today = DateTime.today(TimeZone.getDefault());
        DateTime christmas = DateTime.forDateOnly(today.getYear(), 12, 25);
        int result = 0;
        if (today.isSameDayAs(christmas)) {
            // do nothing
        } else if (today.lt(christmas)) {
            result = today.numDaysFrom(christmas);
        } else if (today.gt(christmas)) {
            DateTime christmasNextYear = DateTime.forDateOnly(
                    today.getYear() + 1, 12, 25);
            result = today.numDaysFrom(christmasNextYear);
        }
        log("Number of days till Christmas : " + result);
        // result Number of days till Christmas : 257
    }

    /**
     * What day is 90 days from today
     
*/
    private void whenIs90DaysFromToday() {
        DateTime today = DateTime.today(TimeZone.getDefault());
        log("90 days from today is : "
                + today.plusDays(90).format("YYYY-MM-DD"));
        // result 90 days from today is : 2012-07-11
    }

    /**
     * 日期相差
     
*/
    private void dateDifference() {
        // DayOverflow.Abort result throw Exception
        
// DayOverflow.Spillover result 2011-05-01
        
// DayOverflow.LastDay result 2011-04-30
        
// DayOverflow.FirstDay result 2011-05-01
        
// public enum DayOverflow {
        
/** Coerce the day to the last day of the month. */
        
// LastDay,
       
 /** Coerce the day to the first day of the next month. */
        
// FirstDay,
        
/** Spillover the day into the next month. */
        
// Spillover,
       
/** Throw a RuntimeException. */
        
// Abort;
        
// }
        /**
         * 
@param aNumYears
         *            positive, required, in range 09999
         * 
@param aNumMonths
         *            positive, required, in range 09999
         * 
@param aNumDays
         *            positive, required, in range 09999
         * 
@param aNumHours
         *            positive, required, in range 09999
         * 
@param aNumMinutes
         *            positive, required, in range 09999
         * 
@param aNumSeconds
         *            positive, required, in range 09999 method plus(Integer
         *            aNumYears, Integer aNumMonths, Integer aNumDays, Integer
         *            aNumHours, Integer aNumMinutes, Integer aNumSeconds,
         *            DayOverflow aDayOverflow)
         * 
         
*/
        DateTime dt = new DateTime("2011-03-31");
        DateTime result = dt.plus(0, 1, 0, 0, 0, 0, DayOverflow.Spillover);
        log("date difference : " + result.toString());
        // result date difference : 2011-05-01 00:00:00
    }

    /** What day is 3 months and 5 days from today? */
    private void whenIs3Months5DaysFromToday() {
        DateTime today = DateTime.today(TimeZone.getDefault());
        DateTime result = today.plus(0, 3, 5, 0, 0, 0,
                DateTime.DayOverflow.FirstDay);
        log("3 months and 5 days from today is : "
                + result.format("YYYY-MM-DD"));
        // result 3 months and 5 days from today is : 2012-07-17
    }

    /**
     * Current number of hours difference between Paris, France and Perth,
     * Australia.
     
*/
    private void hoursDifferenceBetweenParisAndPerth() {
        // this assumes the time diff is a whole number of hours; other styles
        
// are possible
        DateTime paris = DateTime.now(TimeZone.getTimeZone("Europe/Paris"));
        DateTime perth = DateTime.now(TimeZone.getTimeZone("Australia/Perth"));
        int result = perth.getHour() - paris.getHour();
        if (result < 0) {
            result = result + 24;
        }
        log("Numbers of hours difference between Paris and Perth : " + result);
        // result Numbers of hours difference between Paris and Perth : 6
    }

    /** How many weeks is it since Sep 6, 2010? */
    private void weeksSinceStart() {
        DateTime today = DateTime.today(TimeZone.getDefault());
        DateTime startOfProject = DateTime.forDateOnly(2010, 9, 6);
        int result = today.getWeekIndex() - startOfProject.getWeekIndex();
        log("The number of weeks since Sep 6, 2010 : " + result);
        // result The number of weeks since Sep 6, 2010 : 83
    }

    /** How much time till midnight? */
    private void timeTillMidnight() {
        DateTime now = DateTime.now(TimeZone.getDefault());
        DateTime midnight = now.plusDays(1).getStartOfDay();
        long result = now.numSecondsFrom(midnight);
        log("This many seconds till midnight : " + result);
        // result This many seconds till midnight : 83046
    }

    /** Format using ISO style. */
    private void imitateISOFormat() {
        DateTime now = DateTime.now(TimeZone.getDefault());
        log("Output using an ISO format: " + now.format("YYYY-MM-DDThh:mm:ss"));
        // result Output using an ISO format: 2012-04-12T00:55:54
    }

    private void firstDayOfThisWeek() {
        DateTime today = DateTime.today(TimeZone.getDefault());
        DateTime firstDayThisWeek = today; // start value
        int todaysWeekday = today.getWeekDay();
        int SUNDAY = 1;
        if (todaysWeekday > SUNDAY) {
            int numDaysFromSunday = todaysWeekday - SUNDAY;
            firstDayThisWeek = today.minusDays(numDaysFromSunday);
        }
        log("The first day of this week is : " + firstDayThisWeek);
        // result The first day of this week is : 2012-04-08
    }

    /** For how many years has the JDK date-time API been suctorial? */
    private void jdkDatesSuctorial() {
        DateTime today = DateTime.today(TimeZone.getDefault());
        DateTime jdkFirstPublished = DateTime.forDateOnly(1996, 1, 23);
        int result = today.getYear() - jdkFirstPublished.getYear();
        log("The number of years the JDK date-time API has been suctorial : "
                + result);
        // result The number of years the JDK date-time API has been suctorial :
        
// 16
    }
}
posted @ 2012-04-12 01:05 kohri 阅读(2816) | 评论 (0)编辑 收藏
在php中数组赋值的时候用array[]这种方法效率会较高于array_push(),于是乎各种缘由就有了下面的测试
测试代码:
<?php
    
/**
        *数组性能测试
        *for循环遍历测试函数有性能影响所以没有用,不同时调用2个函数也是担心具有影响,不封装同时执行代码是具有影响的
        *测试是更改$count参数(从10~100000 整取递增)和调用方法手动刷新,记录时间为平均大概时间
    *
*/
    
$count = 10;
    arrayTest01(
$count);
    
function arrayTest01($count) {
        
$arr = array ();
        
$time = microtime(true);
        
for ($i = 0$i < $count$i++) {
            
$array[] = $i;
        }
        
echo (microtime(true- $time);
    }
    
function arrayTest02($count) {
        
$arr = array ();
        
$time = microtime(true);
        
for ($i = 0$i < $count$i++) {
            
array_push($arr, $i);
        }
        
echo (microtime(true- $time);
    }
?>

效率大概是array[]快将近一倍,测试环境是ubuntu 11 和 windows 7


windows php-5.2.17/ Apache2.2
times($count)     10 100 1000 10000         100000       1000000
array[] 2.31E-05 0.000104 0.000867 0.008417 0.043666 0.288323
array_push        2.79E-05 0.000181 0.001614 0.014447 0.055875 0.491052
ubuntu11.04 PHP 5.3.6/apache2.2
array[] 1.91E-05 7.70E-05 0.000726 0.007669 0.040492 报错
array_push        2.50E-05 1.26E-04 0.001149 0.013714 0.056978 报错

这是官方网站上的说辞
Note: 如果用 array_push() 来给数组增加一个单元,还不如用 $array[] = ,因为这样没有调用函数的额外负担。
官网链接:
http://cn.php.net/array_push
posted @ 2012-04-04 18:01 kohri 阅读(1749) | 评论 (1)编辑 收藏

导航

<2012年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

统计

常用链接

留言簿

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜