1/* Copyright (c) 2002,2003, Stefan Haustein, Oberhausen, Rhld., Germany
2 *
3 * Permission is hereby granted, free of charge, to any person obtaining a copy
4 * of this software and associated documentation files (the "Software"), to deal
5 * in the Software without restriction, including without limitation the rights
6 * to use, copy, modify, merge, publish, distribute, sublicense, and/or
7 * sell copies of the Software, and to permit persons to whom the Software is
8 * furnished to do so, subject to the following conditions:
9 *
10 * The  above copyright notice and this permission notice shall be included in
11 * all copies or substantial portions of the Software.
12 *
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19 * IN THE SOFTWARE. */
20
21package org.ksoap2.kobjects.isodate;
22
23import java.util.*;
24
25public class IsoDate {
26
27    public static final int DATE = 1;
28    public static final int TIME = 2;
29    public static final int DATE_TIME = 3;
30
31    static void dd(StringBuffer buf, int i) {
32        buf.append((char) (((int) '0') + i / 10));
33        buf.append((char) (((int) '0') + i % 10));
34    }
35
36    public static String dateToString(Date date, int type) {
37
38        Calendar c = Calendar.getInstance();
39        c.setTimeZone(TimeZone.getTimeZone("GMT"));
40        c.setTime(date);
41
42        StringBuffer buf = new StringBuffer();
43
44        if ((type & DATE) != 0) {
45            int year = c.get(Calendar.YEAR);
46            dd(buf, year / 100);
47            dd(buf, year % 100);
48            buf.append('-');
49            dd(
50                    buf,
51                    c.get(Calendar.MONTH) - Calendar.JANUARY + 1);
52            buf.append('-');
53            dd(buf, c.get(Calendar.DAY_OF_MONTH));
54
55            if (type == DATE_TIME)
56                buf.append("T");
57        }
58
59        if ((type & TIME) != 0) {
60            dd(buf, c.get(Calendar.HOUR_OF_DAY));
61            buf.append(':');
62            dd(buf, c.get(Calendar.MINUTE));
63            buf.append(':');
64            dd(buf, c.get(Calendar.SECOND));
65            buf.append('.');
66            int ms = c.get(Calendar.MILLISECOND);
67            buf.append((char) (((int) '0') + (ms / 100)));
68            dd(buf, ms % 100);
69            buf.append('Z');
70        }
71
72        return buf.toString();
73    }
74
75    public static Date stringToDate(String text, int type) {
76
77        Calendar c = Calendar.getInstance();
78
79        if ((type & DATE) != 0) {
80            c.set(
81                    Calendar.YEAR,
82                    Integer.parseInt(text.substring(0, 4)));
83            c.set(
84                    Calendar.MONTH,
85                    Integer.parseInt(text.substring(5, 7))
86                            - 1
87                            + Calendar.JANUARY);
88            c.set(
89                    Calendar.DAY_OF_MONTH,
90                    Integer.parseInt(text.substring(8, 10)));
91
92            if (type != DATE_TIME || text.length() < 11) {
93                c.set(Calendar.HOUR_OF_DAY, 0);
94                c.set(Calendar.MINUTE, 0);
95                c.set(Calendar.SECOND, 0);
96                c.set(Calendar.MILLISECOND, 0);
97                return c.getTime();
98            }
99            text = text.substring(11);
100        }
101        else
102            c.setTime(new Date(0));
103
104        c.set(
105                Calendar.HOUR_OF_DAY,
106                Integer.parseInt(text.substring(0, 2)));
107        // -11
108        c.set(
109                Calendar.MINUTE,
110                Integer.parseInt(text.substring(3, 5)));
111        c.set(
112                Calendar.SECOND,
113                Integer.parseInt(text.substring(6, 8)));
114
115        int pos = 8;
116        if (pos < text.length() && text.charAt(pos) == '.') {
117            int ms = 0;
118            int f = 100;
119            while (true) {
120                char d = text.charAt(++pos);
121                if (d < '0' || d > '9')
122                    break;
123                ms += (d - '0') * f;
124                f /= 10;
125            }
126            c.set(Calendar.MILLISECOND, ms);
127        }
128        else
129            c.set(Calendar.MILLISECOND, 0);
130
131        if (pos < text.length()) {
132
133            if (text.charAt(pos) == '+'
134                    || text.charAt(pos) == '-')
135                c.setTimeZone(
136                        TimeZone.getTimeZone(
137                                "GMT" + text.substring(pos)));
138
139            else if (text.charAt(pos) == 'Z')
140                c.setTimeZone(TimeZone.getTimeZone("GMT"));
141            else
142                throw new RuntimeException("illegal time format!");
143        }
144
145        return c.getTime();
146    }
147}
148