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}