Calculating A date fragment in any time-unit
--------------------------------------------

                 Key: LANG-379
                 URL: https://issues.apache.org/jira/browse/LANG-379
             Project: Commons Lang
          Issue Type: New Feature
    Affects Versions: 2.4
            Reporter: Robert Scholte
            Priority: Minor


These DateUtils-features can make it possible to calculate a date-part in any 
time-unit. For example: the number of minutes of this year, the number of 
seconds of today, etc.

I've started with some coding, and if there's enough interest we can make it 
more solid. 

public static long getFragmentInSeconds(Date date, int fragment) {
                return getFragment(date, fragment, Calendar.SECOND);
        }
        
        public static long getFragmentInMinutes(Date date, int fragment) {
                return getFragment(date, fragment, Calendar.MINUTE);
        }
        
        public static long getFragmentInHours(Date date, int fragment) {
                return getFragment(date, fragment, Calendar.HOUR_OF_DAY);
        }
        
        public static long getFragmentInDays(Date date, int fragment) {
                return getFragment(date, fragment, Calendar.DAY_OF_YEAR);
        }

        public static long getFragmentInSeconds(Calendar calendar, int 
fragment) {
                return getFragment(calendar, fragment, Calendar.SECOND);
        }
        
        public static long getFragmentInMinutes(Calendar calendar, int 
fragment) {
                return getFragment(calendar, fragment, Calendar.MINUTE);
        }
        
        public static long getFragmentInHours(Calendar calendar, int fragment) {
                return getFragment(calendar, fragment, Calendar.HOUR_OF_DAY);
        }
        
        public static long getFragmentInDays(Calendar calendar, int fragment) {
                return getFragment(calendar, fragment, Calendar.DAY_OF_YEAR);
        }
        
        private static long getFragment(Date date, int fragment, int unit) {
                Calendar calendar = Calendar.getInstance();
                calendar.setTime(date);
                return getFragment(calendar, fragment, unit);
        }

        private static long getFragment(Calendar calendar, int fragment, int 
unit) {
                long millisPerUnit = getMillisPerFragment(unit);
                long result = 0;
                switch (fragment) {
                case Calendar.YEAR:
                        result += (calendar.get(Calendar.DAY_OF_YEAR) * 
MILLIS_PER_DAY) / millisPerUnit;
                case Calendar.MONTH:
                        result += (calendar.get(Calendar.DAY_OF_MONTH) * 
MILLIS_PER_DAY) / millisPerUnit;
                case Calendar.DAY_OF_YEAR:
                case Calendar.DATE:
                        result += (calendar.get(Calendar.HOUR_OF_DAY) * 
MILLIS_PER_HOUR) / millisPerUnit;
                case Calendar.HOUR_OF_DAY:
                        result += (calendar.get(Calendar.MINUTE) * 
MILLIS_PER_MINUTE) / millisPerUnit;
                case Calendar.MINUTE:
                        result += (calendar.get(Calendar.SECOND) * 
MILLIS_PER_SECOND) / millisPerUnit;
                case Calendar.SECOND:
                        result += (calendar.get(Calendar.MILLISECOND) * 1) / 
millisPerUnit;
                }
                return result;
        }
        
        private static long getMillisPerFragment(int fragment) {
                long result = Long.MAX_VALUE;
                switch (fragment) {
                case Calendar.DAY_OF_YEAR:
                case Calendar.DATE:
                        result = MILLIS_PER_DAY;
                        break;
                case Calendar.HOUR_OF_DAY:
                        result = MILLIS_PER_HOUR;
                        break;
                case Calendar.MINUTE:
                        result = MILLIS_PER_MINUTE;
                        break;
                case Calendar.SECOND:
                        result = MILLIS_PER_SECOND;
                        break;
                case Calendar.MILLISECOND:
                        result = 1;
                        break;
                }
                return result;
        }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to