--- /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.Locale;\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 Date extends Bean implements org.simantics.xml.sax.base.datatypes.adt.Date {\r
+\r
+ public static final Binding BINDING = Bindings.getBindingUnchecked(Date.class);\r
+\r
+ public int year;\r
+ public byte month;\r
+ public byte day;\r
+ public int offset;\r
+ \r
+ public Date(){\r
+ super(BINDING);\r
+ }\r
+\r
+ public Date(int year, int month, int day) {\r
+ this(year,month,day, java.lang.Integer.MIN_VALUE);\r
+ }\r
+ \r
+ public Date(int year, int month, int day, 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
+ this.year = year;\r
+ this.month = (byte)month;\r
+ this.day = (byte)day;\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 getTimezoneOffset() {\r
+ return offset;\r
+ }\r
+\r
+ @Override\r
+ public java.util.Date getJavaDate() {\r
+ Calendar c = Calendar.getInstance();\r
+ c.set(year, month, day);\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.Date o) {\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
+ return 0;\r
+ }\r
+ \r
+ public static Date parseDate(String dateString) {\r
+ String[] formats = new String[]{"yyyy-MM-ddXXX", "yyyy-MM-dd"};\r
+ boolean[] timezone = new boolean[]{true, false};\r
+ for (int i = 0; i< formats.length; i++) {\r
+ String format = formats[i];\r
+ try {\r
+ SimpleDateFormat dateFormat = new SimpleDateFormat(format, Locale.ROOT);\r
+ java.util.Date n = dateFormat.parse(dateString);\r
+ if (timezone[i]) {\r
+ return new Date(n.getYear()+1900, n.getMonth()+1, n.getDate(), n.getTimezoneOffset());\r
+ }\r
+ return new Date(n.getYear()+1900, n.getMonth()+1, n.getDate());\r
+ } catch (ParseException e) {\r
+ \r
+ }\r
+ }\r
+\r
+ throw new IllegalArgumentException("Time is not in proper format " + dateString);\r
+ \r
+ }\r
+ \r
+ \r
+}\r