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