1+ package utils ;
2+ 3+ import org .apache .commons .lang3 .time .DateUtils ;
4+ 5+ import java .text .SimpleDateFormat ;
6+ import java .util .*;
7+ import java .util .stream .Collectors ;
8+ 9+ 10+ public class HLLUtils {
11+ public static String TIME_FORMAT = "yyyyMMddHHmm" ;
12+ private static String TIME_FORMAT_MONTH_DAY = "MMdd" ;
13+ private static String TIME_FORMAT_DAY_MINUTES = "MMddHHmm" ;
14+ private static String TIME_FORMAT_DAY_HOURS = "MMddHH" ;
15+ static SimpleDateFormat FORMAT_MONTH_DAY = new SimpleDateFormat (TIME_FORMAT_MONTH_DAY );
16+ static SimpleDateFormat FORMAT_DAY_HOURS = new SimpleDateFormat (TIME_FORMAT_DAY_HOURS );
17+ static SimpleDateFormat FORMAT_DAY_MINUTES = new SimpleDateFormat (TIME_FORMAT_DAY_MINUTES );
18+ 19+ public static List <String > parse (Date d1 , Date d2 ) {
20+ ArrayList list ;
21+ if (d1 .compareTo (d2 ) == 0 ) {
22+ return Collections .emptyList ();
23+ }
24+ 25+ // if less than an hour, sum all minutes
26+ long delta = d2 .getTime () - d1 .getTime ();
27+ if (delta == 0 ) {
28+ return Collections .emptyList ();
29+ }
30+ if (delta < DateUtils .MILLIS_PER_HOUR ) {
31+ int minutesDiff = (int ) (delta / DateUtils .MILLIS_PER_MINUTE );
32+ list = new ArrayList <String >();
33+ Date date1Increment = d1 ;
34+ while (d2 .compareTo (date1Increment ) > 0 && minutesDiff > 0 ) {
35+ list .add (FORMAT_DAY_MINUTES .format (date1Increment ));
36+ date1Increment = DateUtils .addMinutes (date1Increment , 1 );
37+ }
38+ // if less than an day, trim hours sum all, pass minutes part
39+ } else if (delta < DateUtils .MILLIS_PER_DAY ) {
40+ list = new ArrayList <String >();
41+ Date dateLastPortionHour = DateUtils .truncate (d2 , Calendar .HOUR_OF_DAY );
42+ list .addAll (parse (dateLastPortionHour , d2 ));
43+ long delta2 = dateLastPortionHour .getTime () - d1 .getTime ();
44+ int hoursDiff = (int ) (delta2 / DateUtils .MILLIS_PER_HOUR );
45+ Date date1Increment = DateUtils .addHours (dateLastPortionHour , -1 * hoursDiff );
46+ while (dateLastPortionHour .compareTo (date1Increment ) > 0 && hoursDiff > 0 ) {
47+ list .add (FORMAT_DAY_HOURS .format (date1Increment ));
48+ date1Increment = DateUtils .addHours (date1Increment , 1 );
49+ }
50+ list .addAll (parse (d1 , DateUtils .addHours (dateLastPortionHour , -1 * hoursDiff )));
51+ } else {
52+ list = new ArrayList <String >();
53+ Date dateLastPortionDay = DateUtils .truncate (d2 , Calendar .DAY_OF_MONTH );
54+ list .addAll (parse (dateLastPortionDay , d2 ));
55+ long delta2 = dateLastPortionDay .getTime () - d1 .getTime ();
56+ // if less than an month, trim days sum all, pass hours part
57+ int daysDiff = (int ) (delta2 / DateUtils .MILLIS_PER_DAY );
58+ // Date date1Increment = d1;
59+ Date date1Increment = DateUtils .addDays (dateLastPortionDay , -1 * daysDiff );
60+ while (dateLastPortionDay .compareTo (date1Increment ) > 0 && daysDiff > 0 ) {
61+ list .add (FORMAT_MONTH_DAY .format (date1Increment ));
62+ date1Increment = DateUtils .addDays (date1Increment , 1 );
63+ }
64+ list .addAll (parse (d1 , DateUtils .addDays (dateLastPortionDay , -1 * daysDiff )));
65+ }
66+ return list ;
67+ }
68+ 69+ public static List <String > getLastMinutes (Date date , int minutes ) {
70+ return parse (DateUtils .addMinutes (date , -1 * minutes ), date );
71+ }
72+ 73+ public static List <String > getLastHours (Date date , int hours ) {
74+ return parse (DateUtils .addHours (date , -1 * hours ), date );
75+ }
76+ 77+ public static List <String > getLastDays (Date date , int days ) {
78+ return parse (DateUtils .addDays (date , -1 * days ), date );
79+ }
80+ 81+ public static List <String > addPrefix (List <String > keys , String prefix ) {
82+ return keys .stream ().map (key -> prefix + key ).collect (Collectors .toList ());
83+ }
84+ }
0 commit comments