--- /dev/null
+package org.simantics.xml.sax.base.datatypes.literal;\r
+\r
+import java.text.ParseException;\r
+import java.text.SimpleDateFormat;\r
+import java.util.Calendar;\r
+import java.util.Date;\r
+import java.util.TimeZone;\r
+\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.databoard.binding.Binding;\r
+import org.simantics.databoard.util.Bean;\r
+\r
+public class DateTime extends Bean implements org.simantics.xml.sax.base.datatypes.adt.DateTime {\r
+\r
+ public static final Binding BINDING = Bindings.getBindingUnchecked(DateTime.class);\r
+\r
+ public int year;\r
+ public byte month;\r
+ public byte day;\r
+ public byte hours;\r
+ public byte minutes;\r
+ public byte seconds;\r
+ public int offset;\r
+ \r
+ public DateTime(){\r
+ super(BINDING);\r
+ }\r
+\r
+ public DateTime(int year, int month, int day, int hours, int minutes, int seconds) {\r
+ this(year, month, day, hours, minutes, seconds, java.lang.Integer.MIN_VALUE);\r
+ }\r
+ \r
+ public DateTime(int year, int month, int day, int hours, int minutes, int seconds, int offset) {\r
+ super(BINDING);\r
+ if (month <= 0 || month > 12) throw new IllegalArgumentException("Month must be between 1 - 12, got " + month);\r
+ if (day <= 0 || day > 31) throw new IllegalArgumentException("Day must be between 1 - 31, got " + day);\r
+ if (hours < 0 || hours > 23) throw new IllegalArgumentException("Hours must be between 0 - 23, got " + hours);\r
+ if (minutes < 0 || minutes > 59) throw new IllegalArgumentException("Minutes must be between 0 - 59, got " + minutes);\r
+ if (seconds < 0 || seconds > 59) throw new IllegalArgumentException("Seconds must be between 0 - 59, got " + seconds);\r
+ this.year = year;\r
+ this.month = (byte)month;\r
+ this.day = (byte)day;\r
+ this.hours = (byte)hours;\r
+ this.minutes = (byte)minutes;\r
+ this.seconds = (byte)seconds;\r
+ this.offset = offset;\r
+ }\r
+\r
+ @Override\r
+ public int getYear() {\r
+ return year;\r
+ }\r
+\r
+ @Override\r
+ public int getMonth() {\r
+ return month;\r
+ }\r
+\r
+ @Override\r
+ public int getDate() {\r
+ return day;\r
+ }\r
+\r
+ @Override\r
+ public int getHours() {\r
+ return hours;\r
+ }\r
+\r
+ @Override\r
+ public int getMinutes() {\r
+ return minutes;\r
+ }\r
+\r
+ @Override\r
+ public int getSeconds() {\r
+ return seconds;\r
+ }\r
+\r
+ @Override\r
+ public int getTimezoneOffset() {\r
+ return offset;\r
+ }\r
+\r
+ @Override\r
+ public Date getJavaDate() {\r
+ Calendar c = Calendar.getInstance();\r
+ c.set(year, month, day, hours, minutes, seconds);\r
+ if (offset != Integer.MIN_VALUE) {\r
+ c.setTimeZone(TimeZone.getTimeZone(TimeZone.getAvailableIDs(offset*60*1000)[0]));\r
+ }\r
+ return c.getTime();\r
+ }\r
+ \r
+ @Override\r
+ public int compare(org.simantics.xml.sax.base.datatypes.adt.DateTime o) {\r
+ // FIXME: take account time offset \r
+ if (getYear() != o.getYear())\r
+ return getYear() - o.getYear();\r
+ if (getMonth() != o.getMonth())\r
+ return getMonth() - o.getMonth();\r
+ if (getDate() != o.getDate())\r
+ return getDate() - o.getDate();\r
+ if (getHours() != o.getHours())\r
+ return getHours() - o.getHours();\r
+ if (getMinutes() != o.getMinutes())\r
+ return getMinutes() - o.getMinutes();\r
+ if (getSeconds() != o.getSeconds())\r
+ return getSeconds() - o.getSeconds();\r
+ return 0;\r
+ }\r
+ \r
+ public static DateTime parseDateTime(String dateString) {\r
+ // FIXME: XML specification allows any number of second decimals!\r
+ // FIXME: endOfDayFrag handling is missing.\r
+ 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
+ boolean[] timezone = new boolean[]{true, true,false,false};\r
+ for (int i = 0; i< formats.length; i++) {\r
+ String format = formats[i];\r
+ try {\r
+ SimpleDateFormat dateFormat = new SimpleDateFormat(format);\r
+ java.util.Date n = dateFormat.parse(dateString);\r
+ if (timezone[i]) {\r
+ return new DateTime(n.getYear()+1900, n.getMonth()+1, n.getDate(), n.getHours(),n.getMinutes(), n.getSeconds(), n.getTimezoneOffset());\r
+ }\r
+ return new DateTime(n.getYear()+1900, n.getMonth()+1, n.getDate(), n.getHours(),n.getMinutes(), n.getSeconds());\r
+ } catch (ParseException e) {\r
+ \r
+ }\r
+ }\r
+\r
+ throw new IllegalArgumentException("Time is not in proper format " + dateString);\r
+ }\r
+\r
+}\r