View Javadoc

1   /* This file is part of the project "Hilbert II" - http://www.qedeq.org" target="alexandria_uri">http://www.qedeq.org
2    *
3    * Copyright 2000-2014,  Michael Meyling <mime@qedeq.org>.
4    *
5    * "Hilbert II" is free software; you can redistribute
6    * it and/or modify it under the terms of the GNU General Public
7    * License as published by the Free Software Foundation; either
8    * version 2 of the License, or (at your option) any later version.
9    *
10   * This program is distributed in the hope that it will be useful,
11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13   * GNU General Public License for more details.
14   */
15  
16  package org.qedeq.base.utility;
17  
18  import java.util.Calendar;
19  import java.util.Date;
20  import java.util.GregorianCalendar;
21  import java.util.TimeZone;
22  
23  import org.apache.commons.lang.time.FastDateFormat;
24  
25  /**
26   * Various methods for date and time handling.
27   *
28   * @author Michael Meyling
29   */
30  public final class DateUtility {
31  
32      /** ISO 8601 date and time format. */
33      public static final FastDateFormat ISO_8601_TIMESTAMP_FORMATTER = FastDateFormat.getInstance(
34          "yyyy-MM-dd'T'HH:mm:ss.SSS");
35  
36      /** ISO 8601 time format. */
37      public static final FastDateFormat ISO_8601_TIME_FORMATTER = FastDateFormat.getInstance(
38          "HH:mm:ss.SSS");
39  
40      /** Date format YYYYMMDD HHmm. */
41      public static final FastDateFormat NICE_TIMESTAMP_FORMATTER = FastDateFormat.getInstance(
42          "yyyy-MM-dd' 'HH:mm:ss.SSS");
43  
44      /** GMT timezone. */
45      private static final TimeZone GMT = TimeZone.getTimeZone("GMT");
46  
47      /**
48       * Hidden constructor.
49       */
50      private DateUtility() {
51          // nothing to do
52      }
53  
54      /**
55       * Current timestamp in ISO 8601 format (date and time).
56       *
57       * @return  Current timestamp.
58       */
59      public static final String getIsoTimestamp() {
60          return ISO_8601_TIMESTAMP_FORMATTER.format(new Date());
61      }
62  
63      /**
64       * Timestamp in ISO 8601 format (date and time).
65       *
66       * @param   date    Date to format.
67       * @return  Timestamp.
68       */
69      public static final String getIsoTimestamp(final Date date) {
70          return ISO_8601_TIMESTAMP_FORMATTER.format(date);
71      }
72  
73      /**
74       * Timestamp in ISO 8601 format (date and time).
75       *
76       * @param   millis  Time in UTC milliseconds from the epoch.
77       * @return  Timestamp.
78       */
79      public static final String getIsoTimestamp(final long millis) {
80          return ISO_8601_TIMESTAMP_FORMATTER.format(getDate(millis));
81      }
82  
83      /**
84       * Times in ISO 8601 format (time).
85       *
86       * @param   millis  Time in UTC milliseconds from the epoch.
87       * @return  Times.
88       */
89      public static final String getIsoTime(final long millis) {
90          return ISO_8601_TIME_FORMATTER.format(getDate(millis));
91      }
92  
93      /**
94       * Current timestamp as ISO 8601 date and time separated by space.
95       *
96       * @return  Current timestamp.
97       */
98      public static final String getTimestamp() {
99          return NICE_TIMESTAMP_FORMATTER.format(new Date());
100     }
101 
102     /**
103      * Current GMT timestamp as ISO 8601 date and time separated by space.
104      *
105      * @return  Current GMT timestamp.
106      */
107     public static final String getGmtTimestamp() {
108         return NICE_TIMESTAMP_FORMATTER.format(getCurrentGmtDate());
109     }
110 
111     /**
112      * Returns a current GMT date.
113      *
114      * @return  Current GMT date.
115      */
116     public static final Date getCurrentGmtDate() {
117         final Calendar cal = Calendar.getInstance(GMT);
118         final Calendar gmtDate = new GregorianCalendar();
119         gmtDate.set(Calendar.MONTH, cal.get(Calendar.MONTH));
120         gmtDate.set(Calendar.YEAR, cal.get(Calendar.YEAR));
121         gmtDate.set(Calendar.DAY_OF_MONTH, cal.get(Calendar.DAY_OF_MONTH));
122         gmtDate.set(Calendar.HOUR_OF_DAY, cal.get(Calendar.HOUR_OF_DAY));
123         gmtDate.set(Calendar.MINUTE, cal.get(Calendar.MINUTE));
124         gmtDate.set(Calendar.SECOND, cal.get(Calendar.SECOND));
125         return gmtDate.getTime();
126     }
127 
128     /**
129      * Convert millisecond duration into readable time amount.
130      *
131      * @param   milliseconds    Duration in milliseconds.
132      * @return  Time in format "[d day[s] ]HH:mm:ss.SSS".
133      */
134     public static final String getDuration(final long milliseconds) {
135         final StringBuffer buffer = new StringBuffer();
136         long factor = 1000 * 60 * 60 * 24;
137         long rest = milliseconds;
138         long mod = 0;
139 
140         // days
141         mod = rest / factor;
142         rest = rest % factor;
143         if (mod > 0) {
144             buffer.append(mod);
145             buffer.append(" day");
146             if (mod > 1) {
147                 buffer.append("s");
148             }
149             buffer.append(" ");
150         }
151 
152         // hours
153         factor = factor / 24;
154         mod = rest / factor;
155         rest = rest % factor;
156         buffer.append(StringUtility.format(mod, 2));
157 
158         buffer.append(":");
159 
160         // minutes
161         factor = factor / 60;
162         mod = rest / factor;
163         rest = rest % factor;
164         buffer.append(StringUtility.format(mod, 2));
165 
166         buffer.append(":");
167 
168         // seconds
169         factor = factor / 60;
170         mod = rest / factor;
171         rest = rest % factor;
172         buffer.append(StringUtility.format(mod, 2));
173 
174         buffer.append(".");
175 
176         // milliseconds
177         factor = factor / 1000;
178         mod = rest / factor;
179         // rest = rest % factor;
180         buffer.append(StringUtility.format(mod, 3));
181 
182         return buffer.toString();
183     }
184 
185     /**
186      * Transform milliseconds from the epoch into date.
187      *
188      * @param   millis  Time in UTC milliseconds from the epoch.
189      * @return  Date.
190      */
191     public static final Date getDate(final long millis) {
192         final Calendar calendar = Calendar.getInstance();
193         calendar.setTimeInMillis(millis);
194         return calendar.getTime();
195     }
196 
197 }