001    package org.apache.archiva.common.utils;
002    
003    /*
004     * Licensed to the Apache Software Foundation (ASF) under one
005     * or more contributor license agreements.  See the NOTICE file
006     * distributed with this work for additional information
007     * regarding copyright ownership.  The ASF licenses this file
008     * to you under the Apache License, Version 2.0 (the
009     * "License"); you may not use this file except in compliance
010     * with the License.  You may obtain a copy of the License at
011     *
012     *  http://www.apache.org/licenses/LICENSE-2.0
013     *
014     * Unless required by applicable law or agreed to in writing,
015     * software distributed under the License is distributed on an
016     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017     * KIND, either express or implied.  See the License for the
018     * specific language governing permissions and limitations
019     * under the License.
020     */
021    
022    import java.util.Calendar;
023    import java.util.Date;
024    import java.util.GregorianCalendar;
025    
026    /**
027     * DateUtil - some (not-so) common date utility methods.
028     *
029     *
030     */
031    public class DateUtil
032    {
033        public static String getDuration( long duration )
034        {
035            return getDuration( new Date( 0 ), new Date( duration ) );
036        }
037    
038        public static String getDuration( long ms1, long ms2 )
039        {
040            return getDuration( new Date( ms1 ), new Date( ms2 ) );
041        }
042    
043        public static String getDuration( Date d1, Date d2 )
044        {
045            Calendar cal1 = new GregorianCalendar();
046            cal1.setTime( d1 );
047    
048            Calendar cal2 = new GregorianCalendar();
049            cal2.setTime( d2 );
050    
051            return getDuration( cal1, cal2 );
052        }
053    
054        public static String getDuration( Calendar cal1, Calendar cal2 )
055        {
056            int year1 = cal1.get( Calendar.YEAR );
057            int day1 = cal1.get( Calendar.DAY_OF_YEAR );
058            int hour1 = cal1.get( Calendar.HOUR_OF_DAY );
059            int min1 = cal1.get( Calendar.MINUTE );
060            int sec1 = cal1.get( Calendar.SECOND );
061            int ms1 = cal1.get( Calendar.MILLISECOND );
062    
063            int year2 = cal2.get( Calendar.YEAR );
064            int day2 = cal2.get( Calendar.DAY_OF_YEAR );
065            int hour2 = cal2.get( Calendar.HOUR_OF_DAY );
066            int min2 = cal2.get( Calendar.MINUTE );
067            int sec2 = cal2.get( Calendar.SECOND );
068            int ms2 = cal2.get( Calendar.MILLISECOND );
069    
070            int leftDays = ( day1 - day2 ) + ( year1 - year2 ) * 365;
071            int leftHours = hour2 - hour1;
072            int leftMins = min2 - min1;
073            int leftSeconds = sec2 - sec1;
074            int leftMilliSeconds = ms2 - ms1;
075    
076            if ( leftMilliSeconds < 0 )
077            {
078                leftMilliSeconds += 1000;
079                --leftSeconds;
080            }
081    
082            if ( leftSeconds < 0 )
083            {
084                leftSeconds += 60;
085                --leftMins;
086            }
087    
088            if ( leftMins < 0 )
089            {
090                leftMins += 60;
091                --leftHours;
092            }
093    
094            if ( leftHours < 0 )
095            {
096                leftHours += 24;
097                --leftDays;
098            }
099    
100            StringBuilder interval = new StringBuilder();
101    
102            appendInterval( interval, leftDays, "Day" );
103            appendInterval( interval, leftHours, "Hour" );
104            appendInterval( interval, leftMins, "Minute" );
105            appendInterval( interval, leftSeconds, "Second" );
106            appendInterval( interval, leftMilliSeconds, "Millisecond" );
107    
108            return interval.toString();
109        }
110    
111        private static void appendInterval( StringBuilder interval, int count, String type )
112        {
113            if ( count > 0 )
114            {
115                if ( interval.length() > 0 )
116                {
117                    interval.append( " " );
118                }
119    
120                interval.append( count );
121                interval.append( " " ).append( type );
122                if ( count > 1 )
123                {
124                    interval.append( "s" );
125                }
126            }
127        }
128    
129    }