]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/datatypes/literal/DateTime.java
ba50b20a254dc382ff2fc25b39b780874f7bb3d5
[simantics/interop.git] / org.simantics.xml.sax.base / src / org / simantics / xml / sax / base / datatypes / literal / DateTime.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 DateTime extends Bean implements org.simantics.xml.sax.base.datatypes.adt.DateTime {\r
14 \r
15         public static final Binding BINDING = Bindings.getBindingUnchecked(DateTime.class);\r
16 \r
17         public int year;\r
18         public byte month;\r
19         public byte day;\r
20         public byte hours;\r
21         public byte minutes;\r
22         public byte seconds;\r
23         public int offset;\r
24         \r
25         public DateTime(){\r
26                 super(BINDING);\r
27         }\r
28 \r
29         public DateTime(int year, int month, int day, int hours, int minutes, int seconds) {\r
30                 this(year, month, day, hours, minutes, seconds, java.lang.Integer.MIN_VALUE);\r
31         }\r
32         \r
33         public DateTime(int year, int month, int day, int hours, int minutes, int seconds, int offset) {\r
34                 super(BINDING);\r
35                 if (month <= 0 || month > 12) throw new IllegalArgumentException("Month must be between 1 - 12, got " + month);\r
36                 if (day <= 0 || day > 31) throw new IllegalArgumentException("Day must be between 1 - 31, got " + day);\r
37                 if (hours < 0 || hours > 23) throw new IllegalArgumentException("Hours must be between 0 - 23, got " + hours);\r
38                 if (minutes < 0 || minutes > 59) throw new IllegalArgumentException("Minutes must be between 0 - 59, got " + minutes);\r
39                 if (seconds < 0 || seconds > 59) throw new IllegalArgumentException("Seconds must be between 0 - 59, got " + seconds);\r
40                 this.year = year;\r
41                 this.month = (byte)month;\r
42                 this.day = (byte)day;\r
43                 this.hours = (byte)hours;\r
44                 this.minutes = (byte)minutes;\r
45                 this.seconds = (byte)seconds;\r
46                 this.offset = offset;\r
47         }\r
48 \r
49         @Override\r
50         public int getYear() {\r
51                 return year;\r
52         }\r
53 \r
54         @Override\r
55         public int getMonth() {\r
56                 return month;\r
57         }\r
58 \r
59         @Override\r
60         public int getDate() {\r
61                 return day;\r
62         }\r
63 \r
64         @Override\r
65         public int getHours() {\r
66                 return hours;\r
67         }\r
68 \r
69         @Override\r
70         public int getMinutes() {\r
71                 return minutes;\r
72         }\r
73 \r
74         @Override\r
75         public int getSeconds() {\r
76                 return seconds;\r
77         }\r
78 \r
79         @Override\r
80         public int getTimezoneOffset() {\r
81                 return offset;\r
82         }\r
83 \r
84         @Override\r
85         public Date getJavaDate() {\r
86                 Calendar c = Calendar.getInstance();\r
87                 c.set(year, month, day, hours, minutes, seconds);\r
88                 if (offset != Integer.MIN_VALUE) {\r
89                         c.setTimeZone(TimeZone.getTimeZone(TimeZone.getAvailableIDs(offset*60*1000)[0]));\r
90                 }\r
91                 return c.getTime();\r
92         }\r
93         \r
94         @Override\r
95         public int compare(org.simantics.xml.sax.base.datatypes.adt.DateTime o) {\r
96                 // FIXME: take account time offset \r
97                 if (getYear() != o.getYear())\r
98                         return getYear() - o.getYear();\r
99                 if (getMonth() != o.getMonth())\r
100                         return getMonth() - o.getMonth();\r
101                 if (getDate() != o.getDate())\r
102                         return getDate() - o.getDate();\r
103                 if (getHours() != o.getHours())\r
104                         return getHours() - o.getHours();\r
105                 if (getMinutes() != o.getMinutes())\r
106                         return getMinutes() - o.getMinutes();\r
107                 if (getSeconds() != o.getSeconds())\r
108                         return getSeconds() - o.getSeconds();\r
109                 return 0;\r
110         }\r
111         \r
112         public static DateTime parseDateTime(String dateString) {\r
113                 // FIXME: XML specification allows any number of second decimals!\r
114                 // FIXME: endOfDayFrag handling is missing.\r
115                 String[] formats = new String[]{"yyyy-MM-dd'T'HH:mm:ssXXX", "yyyy-MM-dd'T'HH:mm:ssSSSSSSSXXX","yyyy-MM-dd'T'HH:mm:ss", "yyyy-MM-dd'T'HH:mm:ssSSSSSSS"};\r
116                 boolean[] timezone = new boolean[]{true, true,false,false};\r
117                 for (int i = 0; i< formats.length; i++) {\r
118                         String format = formats[i];\r
119                         try {\r
120                                 SimpleDateFormat dateFormat = new SimpleDateFormat(format);\r
121                                 java.util.Date n = dateFormat.parse(dateString);\r
122                                 if (timezone[i]) {\r
123                                         return new DateTime(n.getYear()+1900, n.getMonth()+1, n.getDate(), n.getHours(),n.getMinutes(), n.getSeconds(), n.getTimezoneOffset());\r
124                                 }\r
125                                 return new DateTime(n.getYear()+1900, n.getMonth()+1, n.getDate(), n.getHours(),n.getMinutes(), n.getSeconds());\r
126                         }  catch (ParseException e) {\r
127                                 \r
128                         }\r
129                 }\r
130 \r
131                 throw new IllegalArgumentException("Time is not in proper format " + dateString);\r
132         }\r
133 \r
134 }\r