reintroduced StringUtil.regexpReplace
[mir.git] / source / mir / util / DateTimeRoutines.java
1 /*
2  * Copyright (C) 2001-2006 The Mir-coders group
3  *
4  * This file is part of Mir.
5  *
6  * Mir is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * Mir is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with Mir; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  * In addition, as a special exception, The Mir-coders gives permission to link
21  * the code of this program with  any library licensed under the Apache Software License,
22  * and distribute linked combinations including the two.  You must obey the
23  * GNU General Public License in all respects for all of the code used other than
24  * the above mentioned libraries.  If you modify this file, you may extend this
25  * exception to your version of the file, but you are not obligated to do so.
26  * If you do not wish to do so, delete this exception statement from your version.
27  */
28 package mir.util;
29
30 import java.text.SimpleDateFormat;
31 import java.util.Calendar;
32 import java.util.Date;
33 import java.util.GregorianCalendar;
34 import java.util.TimeZone;
35
36 public class DateTimeRoutines {
37   /**
38    * private parameter-less constructor to prevent construction
39    */
40   protected DateTimeRoutines() {
41   }
42
43   private final static String NUMBER = "[0-9]*";
44   private final static String TWODIGITNUMBER = "[0-9][0-9]";
45   
46   /**
47    * Function to parse a <a href="http://www.w3.org/TR/NOTE-datetime">W3CDTF</a> formatted string.
48    *
49    *
50    * YYYY[-MM[-DD[Thh:mm[:ss[.s*]]TZD]]]
51    *
52    * @param aString
53    * @return Date
54    */
55   public static Date parseW3CDTFString(String aString) throws UtilExc, UtilFailure {
56     try {
57       int year = 1;
58       int month = 1;
59       int day = 1;
60       int hour = 0;
61       int minute = 0;
62       int second = 0;
63       int millisecond = 0;
64       int houroffset = 0;
65       int minuteoffset = 0;
66       boolean negativeOffset = false;
67
68
69       SimpleParser parser = new SimpleParser(aString.trim());
70       String part = parser.parse(NUMBER);
71       year=Integer.parseInt(part);
72       if (parser.parses("-")) {
73         parser.skip("-");
74         part = parser.parse(NUMBER);
75         month = Integer.parseInt(part);
76         if (parser.parses("-")) {
77           parser.skip("-");
78           part = parser.parse(NUMBER);
79           day = Integer.parseInt(part);
80           if (parser.parses("T")) {
81             parser.skip("T");
82             part = parser.parse(NUMBER);
83             hour = Integer.parseInt(part);
84             parser.skip(":");
85             part = parser.parse(NUMBER);
86             minute = Integer.parseInt(part);
87             if (parser.parses(":")) {
88               parser.skip(":");
89               part = parser.parse(NUMBER);
90               second = Integer.parseInt(part);
91               if (parser.parses("\\.")) {
92                 parser.skip("\\.");
93                 part = parser.parse(NUMBER).substring(0,3);
94                 while (part.length()<3)
95                   part = "0" + part;
96                 millisecond = Integer.parseInt(part);
97               }
98             }
99             if (parser.parses("Z|\\+|-")) {
100               String sign = parser.parse("Z|\\+|-");
101               if (sign.equals("+") || sign.equals("-")) {
102                 if (parser.parses(TWODIGITNUMBER)) {
103                   part = parser.parse(TWODIGITNUMBER);
104                   houroffset = Integer.parseInt(part);
105                 }
106                 if (parser.parses(":"))
107                   parser.skip(":");
108                 if (parser.parses(TWODIGITNUMBER)) {
109                   part = parser.parse(TWODIGITNUMBER);
110                   minuteoffset = Integer.parseInt(part);
111                 }
112
113                 if (sign.equals("-")) {
114                   negativeOffset=true;
115                 }
116               }
117             }
118           }
119         }
120       }
121
122
123       String timeZoneID = "GMT";
124       if (negativeOffset)
125         timeZoneID = timeZoneID+"-";
126       timeZoneID = timeZoneID + StringRoutines.padStringLeft(Integer.toString(houroffset), 2, '0') +
127                                 StringRoutines.padStringLeft(Integer.toString(minuteoffset), 2, '0');
128
129
130       TimeZone zone = TimeZone.getTimeZone(timeZoneID);
131
132       Calendar calendar = new GregorianCalendar(zone);
133       calendar.set(year, month-1, day, hour, minute, second);
134       calendar.set(Calendar.MILLISECOND, millisecond);
135
136       return calendar.getTime();
137     }
138     catch (Throwable t) {
139 //      logger.error("DateTimeFunctions.parseW3CDTFString: error parsing " + aString + ": " + t.toString());
140
141       throw new UtilFailure(t);
142     }
143   }
144
145   public static String advancedDateFormat(String aFormat, Date aDate, String aTimeZone) {
146     return advancedDateFormat(aFormat, aDate, TimeZone.getTimeZone(aTimeZone));
147   }
148
149   public static String advancedDateFormat(String aFormat, Date aDate, TimeZone aTimeZone) {
150     SimpleDateFormat simpleFormat = new SimpleDateFormat(aFormat);
151
152     simpleFormat.setTimeZone(aTimeZone);
153     return simpleFormat.format(aDate);
154   }
155
156   public static String dateToSortableString(Date aDate) {
157     return advancedDateFormat("yyyyMMddHHmmss", aDate, "GMT");
158   }
159 }