1997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu/* Copyright (c) 2002,2003, Stefan Haustein, Oberhausen, Rhld., Germany
2997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu *
3997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Permission is hereby granted, free of charge, to any person obtaining a copy
4997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * of this software and associated documentation files (the "Software"), to deal
5997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * in the Software without restriction, including without limitation the rights
6997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * to use, copy, modify, merge, publish, distribute, sublicense, and/or
7997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * sell copies of the Software, and to permit persons to whom the Software is
8997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * furnished to do so, subject to the following conditions:
9997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu *
10997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * The  above copyright notice and this permission notice shall be included in
11997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * all copies or substantial portions of the Software.
12997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu *
13997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * IN THE SOFTWARE. */
20997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
21997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yupackage org.ksoap2.kobjects.isodate;
22997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
23997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.util.*;
24997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
25997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yupublic class IsoDate {
26997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
27997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public static final int DATE = 1;
28997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public static final int TIME = 2;
29997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public static final int DATE_TIME = 3;
30997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
31997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    static void dd(StringBuffer buf, int i) {
32997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        buf.append((char) (((int) '0') + i / 10));
33997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        buf.append((char) (((int) '0') + i % 10));
34997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
35997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
36997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public static String dateToString(Date date, int type) {
37997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
38997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        Calendar c = Calendar.getInstance();
39997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        c.setTimeZone(TimeZone.getTimeZone("GMT"));
40997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        c.setTime(date);
41997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
42997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        StringBuffer buf = new StringBuffer();
43997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
44997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if ((type & DATE) != 0) {
45997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            int year = c.get(Calendar.YEAR);
46997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            dd(buf, year / 100);
47997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            dd(buf, year % 100);
48997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            buf.append('-');
49997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            dd(
50997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    buf,
51997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    c.get(Calendar.MONTH) - Calendar.JANUARY + 1);
52997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            buf.append('-');
53997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            dd(buf, c.get(Calendar.DAY_OF_MONTH));
54997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
55997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            if (type == DATE_TIME)
56997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                buf.append("T");
57997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
58997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
59997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if ((type & TIME) != 0) {
60997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            dd(buf, c.get(Calendar.HOUR_OF_DAY));
61997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            buf.append(':');
62997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            dd(buf, c.get(Calendar.MINUTE));
63997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            buf.append(':');
64997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            dd(buf, c.get(Calendar.SECOND));
65997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            buf.append('.');
66997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            int ms = c.get(Calendar.MILLISECOND);
67997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            buf.append((char) (((int) '0') + (ms / 100)));
68997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            dd(buf, ms % 100);
69997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            buf.append('Z');
70997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
71997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
72997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return buf.toString();
73997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
74997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
75997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public static Date stringToDate(String text, int type) {
76997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
77997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        Calendar c = Calendar.getInstance();
78997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
79997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if ((type & DATE) != 0) {
80997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            c.set(
81997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    Calendar.YEAR,
82997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    Integer.parseInt(text.substring(0, 4)));
83997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            c.set(
84997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    Calendar.MONTH,
85997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    Integer.parseInt(text.substring(5, 7))
86997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                            - 1
87997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                            + Calendar.JANUARY);
88997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            c.set(
89997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    Calendar.DAY_OF_MONTH,
90997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    Integer.parseInt(text.substring(8, 10)));
91997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
92997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            if (type != DATE_TIME || text.length() < 11) {
93997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                c.set(Calendar.HOUR_OF_DAY, 0);
94997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                c.set(Calendar.MINUTE, 0);
95997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                c.set(Calendar.SECOND, 0);
96997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                c.set(Calendar.MILLISECOND, 0);
97997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                return c.getTime();
98997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            }
99997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            text = text.substring(11);
100997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
101997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        else
102997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            c.setTime(new Date(0));
103997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
104997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        c.set(
105997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                Calendar.HOUR_OF_DAY,
106997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                Integer.parseInt(text.substring(0, 2)));
107997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        // -11
108997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        c.set(
109997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                Calendar.MINUTE,
110997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                Integer.parseInt(text.substring(3, 5)));
111997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        c.set(
112997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                Calendar.SECOND,
113997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                Integer.parseInt(text.substring(6, 8)));
114997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
115997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        int pos = 8;
116997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if (pos < text.length() && text.charAt(pos) == '.') {
117997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            int ms = 0;
118997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            int f = 100;
119997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            while (true) {
120997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                char d = text.charAt(++pos);
121997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                if (d < '0' || d > '9')
122997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    break;
123997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                ms += (d - '0') * f;
124997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                f /= 10;
125997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            }
126997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            c.set(Calendar.MILLISECOND, ms);
127997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
128997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        else
129997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            c.set(Calendar.MILLISECOND, 0);
130997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
131997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if (pos < text.length()) {
132997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
133997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            if (text.charAt(pos) == '+'
134997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    || text.charAt(pos) == '-')
135997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                c.setTimeZone(
136997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                        TimeZone.getTimeZone(
137997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                                "GMT" + text.substring(pos)));
138997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
139997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            else if (text.charAt(pos) == 'Z')
140997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                c.setTimeZone(TimeZone.getTimeZone("GMT"));
141997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            else
142997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                throw new RuntimeException("illegal time format!");
143997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
144997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
145997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return c.getTime();
146997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
147997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu}
148