1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 package org.apache.hc.core5.http.protocol;
29
30 import java.time.Instant;
31 import java.time.ZoneId;
32 import java.time.format.DateTimeFormatter;
33 import java.time.format.DateTimeFormatterBuilder;
34 import java.util.TimeZone;
35
36 import org.apache.hc.core5.annotation.Contract;
37 import org.apache.hc.core5.annotation.ThreadingBehavior;
38
39
40
41
42
43
44 @Contract(threading = ThreadingBehavior.SAFE)
45 public class HttpDateGenerator {
46
47 private static final int GRANULARITY_MILLIS = 1000;
48
49
50 public static final String PATTERN_RFC1123 = "EEE, dd MMM yyyy HH:mm:ss zzz";
51
52
53
54
55
56 @Deprecated
57 public static final TimeZone GMT = TimeZone.getTimeZone("GMT");
58
59 public static final ZoneId GMT_ID = ZoneId.of("GMT");
60
61
62 public static final HttpDateGenerator INSTANCE = new HttpDateGenerator(PATTERN_RFC1123, GMT_ID);
63
64 private final DateTimeFormatter dateTimeFormatter;
65 private long dateAsMillis;
66 private String dateAsText;
67 private ZoneId zoneId;
68
69 HttpDateGenerator() {
70 dateTimeFormatter =new DateTimeFormatterBuilder()
71 .parseLenient()
72 .parseCaseInsensitive()
73 .appendPattern(PATTERN_RFC1123)
74 .toFormatter();
75 zoneId = GMT_ID;
76
77 }
78
79 private HttpDateGenerator(final String pattern, final ZoneId zoneId) {
80 dateTimeFormatter = new DateTimeFormatterBuilder()
81 .parseLenient()
82 .parseCaseInsensitive()
83 .appendPattern(pattern)
84 .toFormatter();
85 this.zoneId = zoneId;
86 }
87
88 public synchronized String getCurrentDate() {
89 final long now = System.currentTimeMillis();
90 if (now - this.dateAsMillis > GRANULARITY_MILLIS) {
91
92 dateAsText = dateTimeFormatter.format(Instant.now().atZone(zoneId));
93 dateAsMillis = now;
94 }
95 return dateAsText;
96 }
97
98 }