1 package org.simantics.xml.sax.base.datatypes.literal;
\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
9 import org.simantics.databoard.Bindings;
\r
10 import org.simantics.databoard.binding.Binding;
\r
11 import org.simantics.databoard.util.Bean;
\r
13 public class Time extends Bean implements org.simantics.xml.sax.base.datatypes.adt.Time {
\r
15 public static final Binding BINDING = Bindings.getBindingUnchecked(Time.class);
\r
18 public byte minutes;
\r
19 public byte seconds;
\r
27 public Time(int hours, int minutes, int seconds) {
\r
28 this(hours,minutes,seconds, java.lang.Integer.MIN_VALUE);
\r
31 public Time(int hours, int minutes, int seconds, int offset) {
\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
43 public int getHours() {
\r
48 public int getMinutes() {
\r
53 public int getSeconds() {
\r
58 public int getTimezoneOffset() {
\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
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
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
93 SimpleDateFormat dateFormat = new SimpleDateFormat(format);
\r
94 Date n = dateFormat.parse(timeString);
\r
96 return new Time(n.getHours(), n.getMinutes(), n.getSeconds(), n.getTimezoneOffset());
\r
98 return new Time(n.getHours(), n.getMinutes(), n.getSeconds());
\r
99 } catch (ParseException e) {
\r
104 throw new IllegalArgumentException("Time is not in proper format " + timeString);
\r
109 public String toString() {
\r
110 return (hours<10?"0":"")+hours+ ":" + (minutes<10?"0":"")+ minutes + ":"+(seconds<10?"0":"")+seconds;
\r