]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/datatypes/literal/Time.java
fa6456772edc53a183b17593055371259377ad0e
[simantics/interop.git] / org.simantics.xml.sax.base / src / org / simantics / xml / sax / base / datatypes / literal / Time.java
1 package org.simantics.xml.sax.base.datatypes.literal;\r
2 \r
3 import java.text.ParseException;\r
4 import java.text.SimpleDateFormat;\r
5 import java.util.Calendar;\r
6 import java.util.Date;\r
7 import java.util.TimeZone;\r
8 \r
9 import org.simantics.databoard.Bindings;\r
10 import org.simantics.databoard.binding.Binding;\r
11 import org.simantics.databoard.util.Bean;\r
12 \r
13 public class Time extends Bean implements org.simantics.xml.sax.base.datatypes.adt.Time {\r
14 \r
15         public static final Binding BINDING = Bindings.getBindingUnchecked(Time.class);\r
16 \r
17         public byte hours;\r
18         public byte minutes;\r
19         public byte seconds;\r
20         public int offset;\r
21         \r
22         \r
23         public Time(){\r
24                 super(BINDING);\r
25         }\r
26 \r
27         public Time(int hours, int minutes, int seconds) {\r
28                 this(hours,minutes,seconds, java.lang.Integer.MIN_VALUE);\r
29         }\r
30         \r
31         public Time(int hours, int minutes, int seconds, int offset) {\r
32                 super(BINDING);\r
33                 if (hours < 0 || hours > 23) throw new IllegalArgumentException("Hours must be between 0 - 23, got " + hours);\r
34                 if (minutes < 0 || minutes > 59) throw new IllegalArgumentException("Minutes must be between 0 - 59, got " + minutes);\r
35                 if (seconds < 0 || seconds > 59) throw new IllegalArgumentException("Seconds must be between 0 - 59, got " + seconds);\r
36                 this.hours = (byte)hours;\r
37                 this.minutes = (byte)minutes;\r
38                 this.seconds = (byte)seconds;\r
39                 this.offset = offset;\r
40         }\r
41 \r
42         @Override\r
43         public int getHours() {\r
44                 return hours;\r
45         }\r
46 \r
47         @Override\r
48         public int getMinutes() {\r
49                 return minutes;\r
50         }\r
51 \r
52         @Override\r
53         public int getSeconds() {\r
54                 return seconds;\r
55         }\r
56 \r
57         @Override\r
58         public int getTimezoneOffset() {\r
59                 return offset;\r
60         }\r
61 \r
62         @Override\r
63         public Date getJavaDate() {\r
64                 Calendar c = Calendar.getInstance();\r
65                 c.set(Calendar.HOUR_OF_DAY, hours);\r
66                 c.set(Calendar.MINUTE, minutes);\r
67                 c.set(Calendar.SECOND, seconds);\r
68                 if (offset != Integer.MIN_VALUE) {\r
69                         c.setTimeZone(TimeZone.getTimeZone(TimeZone.getAvailableIDs(offset*60*1000)[0]));\r
70                 }\r
71                 return c.getTime();\r
72         }\r
73         \r
74         @Override\r
75         public int compare(org.simantics.xml.sax.base.datatypes.adt.Time o) {\r
76                 // FIXME: take account time offset \r
77                 if (getHours() != o.getHours())\r
78                         return getHours() - o.getHours();\r
79                 if (getMinutes() != o.getMinutes())\r
80                         return getMinutes() - o.getMinutes();\r
81                 if (getSeconds() != o.getSeconds())\r
82                         return getSeconds() - o.getSeconds();\r
83                 return 0;\r
84         }\r
85         \r
86         public static Time parseTime(String timeString) {\r
87                 // FIXME: XML specification allows any number of second decimals!\r
88                 String[] formats = new String[]{"HH:mm:ss.SSSSSSSXXX","HH:mm:ss.SSSSSSS","HH:mm:ss.SSXXX","HH:mm:ss.SS","HH:mm:ssXXX", "HH:mm:ss"};\r
89                 boolean[] timezone = new boolean[]{true, false,true,false,true,false};\r
90                 for (int i = 0; i< formats.length; i++) {\r
91                         String format = formats[i];\r
92                         try {\r
93                                 SimpleDateFormat dateFormat = new SimpleDateFormat(format);\r
94                                 Date n = dateFormat.parse(timeString);\r
95                                 if (timezone[i]) {\r
96                                         return new Time(n.getHours(), n.getMinutes(), n.getSeconds(), n.getTimezoneOffset());\r
97                                 }\r
98                                 return new Time(n.getHours(), n.getMinutes(), n.getSeconds());\r
99                         }  catch (ParseException e) {\r
100                                 \r
101                         }\r
102                 }\r
103 \r
104                 throw new IllegalArgumentException("Time is not in proper format " + timeString);\r
105                 \r
106         }\r
107         \r
108         @Override\r
109         public String toString() {\r
110                 return (hours<10?"0":"")+hours+ ":" + (minutes<10?"0":"")+ minutes + ":"+(seconds<10?"0":"")+seconds;\r
111         }\r
112 \r
113 }\r