1f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling// =================================================================================================
2f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling// ADOBE SYSTEMS INCORPORATED
3f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling// Copyright 2006 Adobe Systems Incorporated
4f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling// All Rights Reserved
5f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling//
6f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling// NOTICE:  Adobe permits you to use, modify, and distribute this file in accordance with the terms
7f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling// of the Adobe license agreement accompanying it.
8f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling// =================================================================================================
9f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
10f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingpackage com.adobe.xmp;
11f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
12f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport java.util.Calendar;
13f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport java.util.Date;
14f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport java.util.GregorianCalendar;
15f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport java.util.TimeZone;
16f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
17f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingimport com.adobe.xmp.impl.XMPDateTimeImpl;
18f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
19f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
20f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling/**
21f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * A factory to create <code>XMPDateTime</code>-instances from a <code>Calendar</code> or an
22f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * ISO 8601 string or for the current time.
23f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling *
24f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling * @since 16.02.2006
25f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling */
26f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberlingpublic final class XMPDateTimeFactory
27f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling{
28f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/** The UTC TimeZone */
29f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	private static final TimeZone UTC = TimeZone.getTimeZone("UTC");
30f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
31f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
32f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
33f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/** Private constructor */
34f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	private XMPDateTimeFactory()
35f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
36f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		// EMPTY
37f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
38f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
39f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
40f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
41f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Creates an <code>XMPDateTime</code> from a <code>Calendar</code>-object.
42f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
43f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param calendar a <code>Calendar</code>-object.
44f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return An <code>XMPDateTime</code>-object.
45f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
46f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public static XMPDateTime createFromCalendar(Calendar calendar)
47f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
48f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		return new XMPDateTimeImpl(calendar);
49f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
50f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
51f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
52f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
53f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Creates an <code>XMPDateTime</code>-object from initial values.
54f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param year years
55f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param month months from 1 to 12<br>
56f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * <em>Note:</em> Remember that the month in {@link Calendar} is defined from 0 to 11.
57f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param day days
58f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param hour hours
59f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param minute minutes
60f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param second seconds
61f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param nanoSecond nanoseconds
62f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return Returns an <code>XMPDateTime</code>-object.
63f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
64f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public static XMPDateTime create(int year, int month, int day,
65f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		int hour, int minute, int second, int nanoSecond)
66f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
67f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		XMPDateTime dt = new XMPDateTimeImpl();
68f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		dt.setYear(year);
69f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		dt.setMonth(month);
70f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		dt.setDay(day);
71f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		dt.setHour(hour);
72f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		dt.setMinute(minute);
73f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		dt.setSecond(second);
74f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		dt.setNanoSecond(nanoSecond);
75f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		return dt;
76f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
77f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
78f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
79f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
80f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Creates an <code>XMPDateTime</code> from an ISO 8601 string.
81f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
82f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param strValue The ISO 8601 string representation of the date/time.
83f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return An <code>XMPDateTime</code>-object.
84f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @throws XMPException When the ISO 8601 string is non-conform
85f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
86f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public static XMPDateTime createFromISO8601(String strValue) throws XMPException
87f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
88f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		return new XMPDateTimeImpl(strValue);
89f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
90f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
91f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
92f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
93f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Obtain the current date and time.
94f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
95f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return Returns The returned time is UTC, properly adjusted for the local time zone. The
96f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *         resolution of the time is not guaranteed to be finer than seconds.
97f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
98f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public static XMPDateTime getCurrentDateTime()
99f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
100f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		return new XMPDateTimeImpl(new GregorianCalendar());
101f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
102f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
103f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
104f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
105f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Sets the local time zone without touching any other Any existing time zone value is replaced,
106f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * the other date/time fields are not adjusted in any way.
107f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
108f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param dateTime the <code>XMPDateTime</code> variable containing the value to be modified.
109f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return Returns an updated <code>XMPDateTime</code>-object.
110f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
111f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public static XMPDateTime setLocalTimeZone(XMPDateTime dateTime)
112f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
113f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		Calendar cal = dateTime.getCalendar();
114f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		cal.setTimeZone(TimeZone.getDefault());
115f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		return new XMPDateTimeImpl(cal);
116f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
117f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
118f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
119f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
120f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Make sure a time is UTC. If the time zone is not UTC, the time is
121f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * adjusted and the time zone set to be UTC.
122f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
123f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param dateTime
124f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            the <code>XMPDateTime</code> variable containing the time to
125f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *            be modified.
126f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return Returns an updated <code>XMPDateTime</code>-object.
127f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
128f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public static XMPDateTime convertToUTCTime(XMPDateTime dateTime)
129f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
130f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		long timeInMillis = dateTime.getCalendar().getTimeInMillis();
131f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		GregorianCalendar cal = new GregorianCalendar(UTC);
132f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		cal.setGregorianChange(new Date(Long.MIN_VALUE));
133f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		cal.setTimeInMillis(timeInMillis);
134f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		return new XMPDateTimeImpl(cal);
135f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
136f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
137f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling
138f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	/**
139f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * Make sure a time is local. If the time zone is not the local zone, the time is adjusted and
140f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * the time zone set to be local.
141f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 *
142f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @param dateTime the <code>XMPDateTime</code> variable containing the time to be modified.
143f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 * @return Returns an updated <code>XMPDateTime</code>-object.
144f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	 */
145f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	public static XMPDateTime convertToLocalTime(XMPDateTime dateTime)
146f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	{
147f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		long timeInMillis = dateTime.getCalendar().getTimeInMillis();
148f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		// has automatically local timezone
149f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		GregorianCalendar cal = new GregorianCalendar();
150f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		cal.setTimeInMillis(timeInMillis);
151f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling		return new XMPDateTimeImpl(cal);
152f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling	}
153f12f744843a67c910ec325fc6dfa73988f67b97cSascha Haeberling}