[ 
https://issues.apache.org/jira/browse/LANG-379?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12557224#action_12557224
 ] 

Robert Scholte commented on LANG-379:
-------------------------------------

I guess Calendar.ERA is a bit too much, because it would mean starting from 
year 0 (whatever that may be)
There are two (switch)-blocks required: the first one to bring the fragment 
back to days (millis per day is the largest available value for calculations, 
since millis per month is not constant). In the second block we can keep 
calculating, if the unit is smaller then a day. And we can check if the 
fragment was valid
I agree on working with Calendars above Dates, but since most DateUtils methods 
use Date and if a Calendar is used in a method there's always a Date-equivalent 
method, I thought it would be nice do the same here.

> 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.3
>            Reporter: Robert Scholte
>            Priority: Minor
>             Fix For: 2.4
>
>         Attachments: DateUtils-fragments.patch, DateUtilsFragmentTest.java
>
>
> 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