package org.simantics.xml.sax.base.datatypes.literal; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Locale; import java.util.TimeZone; import org.simantics.databoard.Bindings; import org.simantics.databoard.binding.Binding; import org.simantics.databoard.util.Bean; public class Date extends Bean implements org.simantics.xml.sax.base.datatypes.adt.Date { public static final Binding BINDING = Bindings.getBindingUnchecked(Date.class); public int year; public byte month; public byte day; public int offset; public Date(){ super(BINDING); } public Date(int year, int month, int day) { this(year,month,day, java.lang.Integer.MIN_VALUE); } public Date(int year, int month, int day, int offset) { super(BINDING); if (month <= 0 || month > 12) throw new IllegalArgumentException("Month must be between 1 - 12, got " + month); if (day <= 0 || day > 31) throw new IllegalArgumentException("Day must be between 1 - 31, got " + day); this.year = year; this.month = (byte)month; this.day = (byte)day; this.offset = offset; } @Override public int getYear() { return year; } @Override public int getMonth() { return month; } @Override public int getDate() { return day; } @Override public int getTimezoneOffset() { return offset; } @Override public java.util.Date getJavaDate() { Calendar c = Calendar.getInstance(); c.set(year, month, day); if (offset != Integer.MIN_VALUE) { c.setTimeZone(TimeZone.getTimeZone(TimeZone.getAvailableIDs(offset*60*1000)[0])); } return c.getTime(); } @Override public int compare(org.simantics.xml.sax.base.datatypes.adt.Date o) { if (getYear() != o.getYear()) return getYear() - o.getYear(); if (getMonth() != o.getMonth()) return getMonth() - o.getMonth(); if (getDate() != o.getDate()) return getDate() - o.getDate(); return 0; } public static Date parseDate(String dateString) { String[] formats = new String[]{"yyyy-MM-ddXXX", "yyyy-MM-dd"}; boolean[] timezone = new boolean[]{true, false}; for (int i = 0; i< formats.length; i++) { String format = formats[i]; try { SimpleDateFormat dateFormat = new SimpleDateFormat(format, Locale.ROOT); java.util.Date n = dateFormat.parse(dateString); if (timezone[i]) { return new Date(n.getYear()+1900, n.getMonth()+1, n.getDate(), n.getTimezoneOffset()); } return new Date(n.getYear()+1900, n.getMonth()+1, n.getDate()); } catch (ParseException e) { } } throw new IllegalArgumentException("Time is not in proper format " + dateString); } @Override public String toString() { return year + "-" +(month<10?"0":"")+ month + "-"+(day<10?"0":"")+day; } }