• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements.  See the NOTICE file distributed with
4  * this work for additional information regarding copyright ownership.
5  * The ASF licenses this file to You under the Apache License, Version 2.0
6  * (the "License"); you may not use this file except in compliance with
7  * the License.  You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 package org.apache.commons.lang3.time;
18 
19 import java.util.TimeZone;
20 import java.util.regex.Matcher;
21 import java.util.regex.Pattern;
22 
23 /**
24  * Faster methods to produce custom time zones.
25  *
26  * @since 3.7
27  */
28 public class FastTimeZone {
29 
30     private static final Pattern GMT_PATTERN = Pattern.compile("^(?:(?i)GMT)?([+-])?(\\d\\d?)?(:?(\\d\\d?))?$");
31 
32     private static final TimeZone GREENWICH = new GmtTimeZone(false, 0, 0);
33 
34     /**
35      * Gets the GMT TimeZone.
36      * @return A TimeZone with a raw offset of zero.
37      */
getGmtTimeZone()38     public static TimeZone getGmtTimeZone() {
39         return GREENWICH;
40     }
41 
42     /**
43      * Gets a TimeZone with GMT offsets.  A GMT offset must be either 'Z', or 'UTC', or match
44      * <em>(GMT)? hh?(:?mm?)?</em>, where h and m are digits representing hours and minutes.
45      *
46      * @param pattern The GMT offset
47      * @return A TimeZone with offset from GMT or null, if pattern does not match.
48      */
getGmtTimeZone(final String pattern)49     public static TimeZone getGmtTimeZone(final String pattern) {
50         if ("Z".equals(pattern) || "UTC".equals(pattern)) {
51             return GREENWICH;
52         }
53 
54         final Matcher m = GMT_PATTERN.matcher(pattern);
55         if (m.matches()) {
56             final int hours = parseInt(m.group(2));
57             final int minutes = parseInt(m.group(4));
58             if (hours == 0 && minutes == 0) {
59                 return GREENWICH;
60             }
61             return new GmtTimeZone(parseSign(m.group(1)), hours, minutes);
62         }
63         return null;
64     }
65 
66     /**
67      * Gets a TimeZone, looking first for GMT custom ids, then falling back to Olson ids.
68      * A GMT custom id can be 'Z', or 'UTC', or has an optional prefix of GMT,
69      * followed by sign, hours digit(s), optional colon(':'), and optional minutes digits.
70      * i.e. <em>[GMT] (+|-) Hours [[:] Minutes]</em>
71      *
72      * @param id A GMT custom id (or Olson id
73      * @return A time zone
74      */
getTimeZone(final String id)75     public static TimeZone getTimeZone(final String id) {
76         final TimeZone tz = getGmtTimeZone(id);
77         if (tz != null) {
78             return tz;
79         }
80         return TimeZone.getTimeZone(id);
81     }
82 
parseInt(final String group)83     private static int parseInt(final String group) {
84         return group != null ? Integer.parseInt(group) : 0;
85     }
86 
parseSign(final String group)87     private static boolean parseSign(final String group) {
88         return group != null && group.charAt(0) == '-';
89     }
90 
91     // do not instantiate
FastTimeZone()92     private FastTimeZone() {
93     }
94 
95 }
96