michael@0: /** michael@0: * Copyright (c) 2012, Ben Fortuna michael@0: * All rights reserved. michael@0: * michael@0: * Redistribution and use in source and binary forms, with or without michael@0: * modification, are permitted provided that the following conditions michael@0: * are met: michael@0: * michael@0: * o Redistributions of source code must retain the above copyright michael@0: * notice, this list of conditions and the following disclaimer. michael@0: * michael@0: * o Redistributions in binary form must reproduce the above copyright michael@0: * notice, this list of conditions and the following disclaimer in the michael@0: * documentation and/or other materials provided with the distribution. michael@0: * michael@0: * o Neither the name of Ben Fortuna nor the names of any other contributors michael@0: * may be used to endorse or promote products derived from this software michael@0: * without specific prior written permission. michael@0: * michael@0: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS michael@0: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT michael@0: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR michael@0: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR michael@0: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, michael@0: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, michael@0: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR michael@0: * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF michael@0: * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING michael@0: * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS michael@0: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. michael@0: */ michael@0: package net.fortuna.ical4j.model; michael@0: michael@0: import java.text.DateFormat; michael@0: import java.text.ParseException; michael@0: import java.text.SimpleDateFormat; michael@0: import java.util.TimeZone; michael@0: michael@0: import net.fortuna.ical4j.util.Dates; michael@0: import net.fortuna.ical4j.util.TimeZones; michael@0: michael@0: /** michael@0: * $Id$ michael@0: * michael@0: * Created on 30/06/2005 michael@0: * michael@0: * A type used to represent iCalendar time values. michael@0: * @author Ben Fortuna michael@0: */ michael@0: public class Time extends Iso8601 { michael@0: michael@0: private static final long serialVersionUID = -8401010870773304348L; michael@0: michael@0: private boolean utc = false; michael@0: michael@0: /** michael@0: * FORM #1: LOCAL TIME. michael@0: */ michael@0: private static final String DEFAULT_PATTERN = "HHmmss"; michael@0: michael@0: /** michael@0: * FORM #2: UTC TIME. michael@0: */ michael@0: private static final String UTC_PATTERN = "HHmmss'Z'"; michael@0: michael@0: /** michael@0: * @param timezone a timezone for the instance michael@0: */ michael@0: public Time(final TimeZone timezone) { michael@0: this(timezone, TimeZones.isUtc(timezone)); michael@0: } michael@0: michael@0: /** michael@0: * @param timezone a timezone for the instance michael@0: * @param utc indicates if the time is in UTC michael@0: */ michael@0: public Time(final TimeZone timezone, boolean utc) { michael@0: super(utc ? UTC_PATTERN : DEFAULT_PATTERN, Dates.PRECISION_SECOND, timezone); michael@0: getFormat().setTimeZone(timezone); michael@0: this.utc = utc; michael@0: } michael@0: michael@0: /** michael@0: * @param time a time value in milliseconds from the epoch michael@0: * @param timezone a timezone for the instance michael@0: */ michael@0: public Time(final long time, final TimeZone timezone) { michael@0: this(time, timezone, TimeZones.isUtc(timezone)); michael@0: } michael@0: michael@0: /** michael@0: * @param time a time value in milliseconds from the epoch michael@0: * @param timezone a timezone for the instance michael@0: * @param utc indicates if the time is in UTC michael@0: */ michael@0: public Time(final long time, final TimeZone timezone, boolean utc) { michael@0: super(time, (utc ? UTC_PATTERN : DEFAULT_PATTERN), Dates.PRECISION_SECOND, timezone); michael@0: getFormat().setTimeZone(timezone); michael@0: this.utc = utc; michael@0: } michael@0: michael@0: /** michael@0: * @param time a time value in milliseconds from the epoch michael@0: * @param timezone a timezone for the instance michael@0: */ michael@0: public Time(final java.util.Date time, final TimeZone timezone) { michael@0: this(time, timezone, TimeZones.isUtc(timezone)); michael@0: } michael@0: michael@0: /** michael@0: * @param time a time value as a Java date instance michael@0: * @param timezone a timezone for the instance michael@0: * @param utc indicates if the time is in UTC michael@0: */ michael@0: public Time(final java.util.Date time, final TimeZone timezone, boolean utc) { michael@0: super(time.getTime(), (utc ? UTC_PATTERN : DEFAULT_PATTERN), Dates.PRECISION_SECOND, timezone); michael@0: getFormat().setTimeZone(timezone); michael@0: this.utc = utc; michael@0: } michael@0: michael@0: /** michael@0: * @param value michael@0: * @param timezone michael@0: * @throws ParseException where the specified value is not a valid time string michael@0: */ michael@0: public Time(String value, TimeZone timezone) throws ParseException { michael@0: this(value, timezone, TimeZones.isUtc(timezone)); michael@0: } michael@0: michael@0: /** michael@0: * @param value michael@0: * @param timezone michael@0: * @param utc michael@0: * @throws ParseException where the specified value is not a valid time string michael@0: */ michael@0: public Time(String value, TimeZone timezone, boolean utc) throws ParseException { michael@0: this(parseDate(value, timezone), timezone, utc); michael@0: } michael@0: michael@0: private static java.util.Date parseDate(String value, TimeZone timezone) throws ParseException { michael@0: DateFormat df = new SimpleDateFormat(DEFAULT_PATTERN); michael@0: df.setTimeZone(timezone); michael@0: try { michael@0: return df.parse(value); michael@0: } michael@0: catch (ParseException e) { michael@0: df = new SimpleDateFormat(UTC_PATTERN); michael@0: df.setTimeZone(timezone); michael@0: } michael@0: return df.parse(value); michael@0: } michael@0: michael@0: /** michael@0: * @return true if time is utc michael@0: */ michael@0: public final boolean isUtc() { michael@0: return utc; michael@0: } michael@0: }