19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.text.format; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Locale; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.TimeZone; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Time class is a faster replacement for the java.util.Calendar and 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * java.util.GregorianCalendar classes. An instance of the Time class represents 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a moment in time, specified with second precision. It is modelled after 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * struct tm, and in fact, uses struct tm to implement most of the 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * functionality. 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Time { 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String Y_M_D_T_H_M_S_000 = "%Y-%m-%dT%H:%M:%S.000"; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String Y_M_D_T_H_M_S_000_Z = "%Y-%m-%dT%H:%M:%S.000Z"; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String Y_M_D = "%Y-%m-%d"; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String TIMEZONE_UTC = "UTC"; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Julian day of the epoch, that is, January 1, 1970 on the Gregorian 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * calendar. 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int EPOCH_JULIAN_DAY = 2440588; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * True if this is an allDay event. The hour, minute, second fields are 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * all zero, and the date is displayed the same in all time zones. 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean allDay; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Seconds [0-61] (2 leap seconds allowed) 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int second; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Minute [0-59] 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int minute; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Hour of day [0-23] 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int hour; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Day of month [1-31] 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int monthDay; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Month [0-11] 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int month; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Year. TBD. Is this years since 1900 like in struct tm? 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int year; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Day of week [0-6] 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int weekDay; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Day of year [0-365] 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int yearDay; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This time is in daylight savings time. One of: 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>positive</b> - in dst</li> 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>0</b> - not in dst</li> 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><b>negative</b> - unknown</li> 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int isDst; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Offset from UTC (in seconds). 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long gmtoff; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The timezone for this Time. Should not be null. 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String timezone; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Define symbolic constants for accessing the fields in this class. Used in 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * getActualMaximum(). 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SECOND = 1; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int MINUTE = 2; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HOUR = 3; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int MONTH_DAY = 4; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int MONTH = 5; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int YEAR = 6; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WEEK_DAY = 7; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int YEAR_DAY = 8; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WEEK_NUM = 9; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SUNDAY = 0; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int MONDAY = 1; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int TUESDAY = 2; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WEDNESDAY = 3; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int THURSDAY = 4; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FRIDAY = 5; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SATURDAY = 6; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Locale for which date formatting strings have been loaded. 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static Locale sLocale; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String[] sShortMonths; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String[] sLongMonths; 1385bd644caf73e76750feef1a82b8817d32f5367fcEric Fischer private static String[] sLongStandaloneMonths; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String[] sShortWeekdays; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String[] sLongWeekdays; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String sTimeOnlyFormat; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String sDateOnlyFormat; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String sDateTimeFormat; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String sAm; 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String sPm; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String sDateCommand = "%a %b %e %H:%M:%S %Z %Y"; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Construct a Time object in the timezone named by the string 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * argument "timezone". The time is initialized to Jan 1, 1970. 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param timezone string containing the timezone to use. 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see TimeZone 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Time(String timezone) { 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timezone == null) { 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException("timezone is null!"); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.timezone = timezone; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.year = 1970; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.monthDay = 1; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Set the daylight-saving indicator to the unknown value -1 so that 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // it will be recomputed. 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.isDst = -1; 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Construct a Time object in the default timezone. The time is initialized to 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Jan 1, 1970. 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Time() { 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(TimeZone.getDefault().getID()); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A copy constructor. Construct a Time object by copying the given 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Time object. No normalization occurs. 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param other 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Time(Time other) { 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project set(other); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Ensures the values in each field are in range. For example if the 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current value of this calendar is March 32, normalize() will convert it 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to April 1. It also fills in weekDay, yearDay, isDst and gmtoff. 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If "ignoreDst" is true, then this method sets the "isDst" field to -1 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (the "unknown" value) before normalizing. It then computes the 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * correct value for "isDst". 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See {@link #toMillis(boolean)} for more information about when to 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * use <tt>true</tt> or <tt>false</tt> for "ignoreDst". 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the UTC milliseconds since the epoch 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native public long normalize(boolean ignoreDst); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Convert this time object so the time represented remains the same, but is 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instead located in a different timezone. This method automatically calls 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * normalize() in some cases 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native public void switchTimezone(String timezone); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int[] DAYS_PER_MONTH = { 31, 28, 31, 30, 31, 30, 31, 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31, 30, 31, 30, 31 }; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the maximum possible value for the given field given the value of 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the other fields. Requires that it be normalized for MONTH_DAY and 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * YEAR_DAY. 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param field one of the constants for HOUR, MINUTE, SECOND, etc. 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the maximum value for the field. 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getActualMaximum(int field) { 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (field) { 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SECOND: 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 59; // leap seconds, bah humbug 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case MINUTE: 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 59; 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case HOUR: 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 23; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case MONTH_DAY: { 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int n = DAYS_PER_MONTH[this.month]; 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (n != 28) { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return n; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y = this.year; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ((y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0)) ? 29 : 28; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case MONTH: 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 11; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case YEAR: 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 2037; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WEEK_DAY: 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 6; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case YEAR_DAY: { 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y = this.year; 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Year days are numbered from 0, so the last one is usually 364. 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ((y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0)) ? 365 : 364; 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WEEK_NUM: 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("WEEK_NUM not implemented"); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad field=" + field); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Clears all values, setting the timezone to the given timezone. Sets isDst 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to a negative value to mean "unknown". 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param timezone the timezone to use. 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clear(String timezone) { 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timezone == null) { 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException("timezone is null!"); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.timezone = timezone; 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.allDay = false; 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.second = 0; 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.minute = 0; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.hour = 0; 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.monthDay = 0; 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.month = 0; 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.year = 0; 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.weekDay = 0; 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.yearDay = 0; 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.gmtoff = 0; 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.isDst = -1; 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return a negative number if a is less than b, a positive number if a is 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * greater than b, and 0 if they are equal. 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native public static int compare(Time a, Time b); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Print the current value given the format string provided. See man 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * strftime for what means what. The final string must be less than 256 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * characters. 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param format a string containing the desired format. 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a String containing the current time expressed in the current locale. 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String format(String format) { 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (Time.class) { 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Locale locale = Locale.getDefault(); 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sLocale == null || locale == null || !(locale.equals(sLocale))) { 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources r = Resources.getSystem(); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sShortMonths = new String[] { 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.month_medium_january), 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.month_medium_february), 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.month_medium_march), 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.month_medium_april), 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.month_medium_may), 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.month_medium_june), 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.month_medium_july), 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.month_medium_august), 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.month_medium_september), 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.month_medium_october), 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.month_medium_november), 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.month_medium_december), 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sLongMonths = new String[] { 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.month_long_january), 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.month_long_february), 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.month_long_march), 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.month_long_april), 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.month_long_may), 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.month_long_june), 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.month_long_july), 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.month_long_august), 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.month_long_september), 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.month_long_october), 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.month_long_november), 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.month_long_december), 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3255bd644caf73e76750feef1a82b8817d32f5367fcEric Fischer sLongStandaloneMonths = new String[] { 3265bd644caf73e76750feef1a82b8817d32f5367fcEric Fischer r.getString(com.android.internal.R.string.month_long_standalone_january), 3275bd644caf73e76750feef1a82b8817d32f5367fcEric Fischer r.getString(com.android.internal.R.string.month_long_standalone_february), 3285bd644caf73e76750feef1a82b8817d32f5367fcEric Fischer r.getString(com.android.internal.R.string.month_long_standalone_march), 3295bd644caf73e76750feef1a82b8817d32f5367fcEric Fischer r.getString(com.android.internal.R.string.month_long_standalone_april), 3305bd644caf73e76750feef1a82b8817d32f5367fcEric Fischer r.getString(com.android.internal.R.string.month_long_standalone_may), 3315bd644caf73e76750feef1a82b8817d32f5367fcEric Fischer r.getString(com.android.internal.R.string.month_long_standalone_june), 3325bd644caf73e76750feef1a82b8817d32f5367fcEric Fischer r.getString(com.android.internal.R.string.month_long_standalone_july), 3335bd644caf73e76750feef1a82b8817d32f5367fcEric Fischer r.getString(com.android.internal.R.string.month_long_standalone_august), 3345bd644caf73e76750feef1a82b8817d32f5367fcEric Fischer r.getString(com.android.internal.R.string.month_long_standalone_september), 3355bd644caf73e76750feef1a82b8817d32f5367fcEric Fischer r.getString(com.android.internal.R.string.month_long_standalone_october), 3365bd644caf73e76750feef1a82b8817d32f5367fcEric Fischer r.getString(com.android.internal.R.string.month_long_standalone_november), 3375bd644caf73e76750feef1a82b8817d32f5367fcEric Fischer r.getString(com.android.internal.R.string.month_long_standalone_december), 3385bd644caf73e76750feef1a82b8817d32f5367fcEric Fischer }; 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sShortWeekdays = new String[] { 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.day_of_week_medium_sunday), 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.day_of_week_medium_monday), 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.day_of_week_medium_tuesday), 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.day_of_week_medium_wednesday), 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.day_of_week_medium_thursday), 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.day_of_week_medium_friday), 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.day_of_week_medium_saturday), 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sLongWeekdays = new String[] { 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.day_of_week_long_sunday), 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.day_of_week_long_monday), 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.day_of_week_long_tuesday), 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.day_of_week_long_wednesday), 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.day_of_week_long_thursday), 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.day_of_week_long_friday), 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.getString(com.android.internal.R.string.day_of_week_long_saturday), 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sTimeOnlyFormat = r.getString(com.android.internal.R.string.time_of_day); 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sDateOnlyFormat = r.getString(com.android.internal.R.string.month_day_year); 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sDateTimeFormat = r.getString(com.android.internal.R.string.date_and_time); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sAm = r.getString(com.android.internal.R.string.am); 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sPm = r.getString(com.android.internal.R.string.pm); 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sLocale = locale; 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return format1(format); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native private String format1(String format); 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the current time in YYYYMMDDTHHMMSS<tz> format 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native public String toString(); 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parses a date-time string in either the RFC 2445 format or an abbreviated 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * format that does not include the "time" field. For example, all of the 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * following strings are valid: 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>"20081013T160000Z"</li> 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>"20081013T160000"</li> 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>"20081013"</li> 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns whether or not the time is in UTC (ends with Z). If the string 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ends with "Z" then the timezone is set to UTC. If the date-time string 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * included only a date and no time field, then the <code>allDay</code> 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * field of this Time class is set to true and the <code>hour</code>, 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>minute</code>, and <code>second</code> fields are set to zero; 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise (a time field was included in the date-time string) 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>allDay</code> is set to false. The fields <code>weekDay</code>, 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>yearDay</code>, and <code>gmtoff</code> are always set to zero, 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the field <code>isDst</code> is set to -1 (unknown). To set those 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * fields, call {@link #normalize(boolean)} after parsing. 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * To parse a date-time string and convert it to UTC milliseconds, do 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * something like this: 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre> 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Time time = new Time(); 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * String date = "20081013T160000Z"; 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * time.parse(date); 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * long millis = time.normalize(false); 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre> 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param s the string to parse 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the resulting time value is in UTC time 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws android.util.TimeFormatException if s cannot be parsed. 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean parse(String s) { 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nativeParse(s)) { 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project timezone = TIMEZONE_UTC; 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parse a time in the current zone in YYYYMMDDTHHMMSS format. 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native private boolean nativeParse(String s); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parse a time in RFC 3339 format. This method also parses simple dates 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (that is, strings that contain no time or time offset). For example, 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * all of the following strings are valid: 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>"2008-10-13T16:00:00.000Z"</li> 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>"2008-10-13T16:00:00.000+07:00"</li> 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>"2008-10-13T16:00:00.000-07:00"</li> 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>"2008-10-13"</li> 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the string contains a time and time offset, then the time offset will 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be used to convert the time value to UTC. 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the given string contains just a date (with no time field), then 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the {@link #allDay} field is set to true and the {@link #hour}, 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #minute}, and {@link #second} fields are set to zero. 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns true if the resulting time value is in UTC time. 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param s the string to parse 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the resulting time value is in UTC time 456670bf11fcf9e0a73007b9b814069aa575a872096Ken Shirriff * @throws android.util.TimeFormatException if s cannot be parsed. 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean parse3339(String s) { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nativeParse3339(s)) { 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project timezone = TIMEZONE_UTC; 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native private boolean nativeParse3339(String s); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the timezone string that is currently set for the device. 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static String getCurrentTimezone() { 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TimeZone.getDefault().getID(); 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the time of the given Time object to the current time. 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native public void setToNow(); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Converts this time to milliseconds. Suitable for interacting with the 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * standard java libraries. The time is in UTC milliseconds since the epoch. 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This does an implicit normalization to compute the milliseconds but does 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <em>not</em> change any of the fields in this Time object. If you want 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to normalize the fields in this Time object and also get the milliseconds 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * then use {@link #normalize(boolean)}. 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If "ignoreDst" is false, then this method uses the current setting of the 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "isDst" field and will adjust the returned time if the "isDst" field is 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wrong for the given time. See the sample code below for an example of 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this. 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If "ignoreDst" is true, then this method ignores the current setting of 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the "isDst" field in this Time object and will instead figure out the 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * correct value of "isDst" (as best it can) from the fields in this 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Time object. The only case where this method cannot figure out the 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * correct value of the "isDst" field is when the time is inherently 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ambiguous because it falls in the hour that is repeated when switching 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from Daylight-Saving Time to Standard Time. 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Here is an example where <tt>toMillis(true)</tt> adjusts the time, 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * assuming that DST changes at 2am on Sunday, Nov 4, 2007. 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre> 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Time time = new Time(); 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * time.set(2007, 10, 4); // set the date to Nov 4, 2007, 12am 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * time.normalize(); // this sets isDst = 1 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * time.monthDay += 1; // changes the date to Nov 5, 2007, 12am 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * millis = time.toMillis(false); // millis is Nov 4, 2007, 11pm 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * millis = time.toMillis(true); // millis is Nov 5, 2007, 12am 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre> 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * To avoid this problem, use <tt>toMillis(true)</tt> 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * after adding or subtracting days or explicitly setting the "monthDay" 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * field. On the other hand, if you are adding 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or subtracting hours or minutes, then you should use 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tt>toMillis(false)</tt>. 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You should also use <tt>toMillis(false)</tt> if you want 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to read back the same milliseconds that you set with {@link #set(long)} 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or {@link #set(Time)} or after parsing a date string. 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native public long toMillis(boolean ignoreDst); 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the fields in this Time object given the UTC milliseconds. After 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this method returns, all the fields are normalized. 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This also sets the "isDst" field to the correct value. 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param millis the time in UTC milliseconds since the epoch. 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native public void set(long millis); 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Format according to RFC 2445 DATETIME type. 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The same as format("%Y%m%dT%H%M%S"). 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native public String format2445(); 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copy the value of that to this Time object. No normalization happens. 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void set(Time that) { 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.timezone = that.timezone; 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.allDay = that.allDay; 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.second = that.second; 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.minute = that.minute; 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.hour = that.hour; 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.monthDay = that.monthDay; 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.month = that.month; 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.year = that.year; 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.weekDay = that.weekDay; 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.yearDay = that.yearDay; 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.isDst = that.isDst; 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.gmtoff = that.gmtoff; 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the fields. Sets weekDay, yearDay and gmtoff to 0, and isDst to -1. 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Call {@link #normalize(boolean)} if you need those. 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void set(int second, int minute, int hour, int monthDay, int month, int year) { 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.allDay = false; 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.second = second; 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.minute = minute; 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.hour = hour; 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.monthDay = monthDay; 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.month = month; 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.year = year; 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.weekDay = 0; 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.yearDay = 0; 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.isDst = -1; 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.gmtoff = 0; 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the date from the given fields. Also sets allDay to true. 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets weekDay, yearDay and gmtoff to 0, and isDst to -1. 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Call {@link #normalize(boolean)} if you need those. 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param monthDay the day of the month (in the range [1,31]) 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param month the zero-based month number (in the range [0,11]) 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param year the year 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void set(int monthDay, int month, int year) { 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.allDay = true; 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.second = 0; 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.minute = 0; 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.hour = 0; 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.monthDay = monthDay; 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.month = month; 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.year = year; 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.weekDay = 0; 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.yearDay = 0; 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.isDst = -1; 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.gmtoff = 0; 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns true if the time represented by this Time object occurs before 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the given time. 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param that a given Time object to compare against 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if this time is less than the given time 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean before(Time that) { 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Time.compare(this, that) < 0; 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns true if the time represented by this Time object occurs after 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the given time. 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param that a given Time object to compare against 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if this time is greater than the given time 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean after(Time that) { 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Time.compare(this, that) > 0; 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This array is indexed by the weekDay field (SUNDAY=0, MONDAY=1, etc.) 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and gives a number that can be added to the yearDay to give the 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * closest Thursday yearDay. 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int[] sThursdayOffset = { -3, 3, 2, 1, 0, -1, -2 }; 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Computes the week number according to ISO 8601. The current Time 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object must already be normalized because this method uses the 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * yearDay and weekDay fields. 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * In IS0 8601, weeks start on Monday. 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The first week of the year (week 1) is defined by ISO 8601 as the 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * first week with four or more of its days in the starting year. 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Or equivalently, the week containing January 4. Or equivalently, 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the week with the year's first Thursday in it. 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The week number can be calculated by counting Thursdays. Week N 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * contains the Nth Thursday of the year. 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the ISO week number. 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getWeekNumber() { 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get the year day for the closest Thursday 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int closestThursday = yearDay + sThursdayOffset[weekDay]; 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Year days start at 0 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (closestThursday >= 0 && closestThursday <= 364) { 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return closestThursday / 7 + 1; 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The week crosses a year boundary. 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Time temp = new Time(this); 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project temp.monthDay += sThursdayOffset[weekDay]; 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project temp.normalize(true /* ignore isDst */); 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return temp.yearDay / 7 + 1; 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a string in the RFC 3339 format. 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If allDay is true, expresses the time as Y-M-D</p> 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Otherwise, if the timezone is UTC, expresses the time as Y-M-D-T-H-M-S UTC</p> 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Otherwise the time is expressed the time as Y-M-D-T-H-M-S +- GMT</p> 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param allDay 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return string in the RFC 3339 format. 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String format3339(boolean allDay) { 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (allDay) { 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return format(Y_M_D); 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (TIMEZONE_UTC.equals(timezone)) { 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return format(Y_M_D_T_H_M_S_000_Z); 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String base = format(Y_M_D_T_H_M_S_000); 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String sign = (gmtoff < 0) ? "-" : "+"; 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int offset = (int)Math.abs(gmtoff); 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int minutes = (offset % 3600) / 60; 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int hours = offset / 3600; 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return String.format("%s%s%02d:%02d", base, sign, hours, minutes); 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns true if the day of the given time is the epoch on the Julian Calendar 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (January 1, 1970 on the Gregorian calendar). 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param time the time to test 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if epoch. 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static boolean isEpoch(Time time) { 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long millis = time.toMillis(true); 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getJulianDay(millis, 0) == EPOCH_JULIAN_DAY; 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Computes the Julian day number, given the UTC milliseconds 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the offset (in seconds) from UTC. The Julian day for a given 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * date will be the same for every timezone. For example, the Julian 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * day for July 1, 2008 is 2454649. This is the same value no matter 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * what timezone is being used. The Julian day is useful for testing 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if two events occur on the same day and for determining the relative 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * time of an event from the present ("yesterday", "3 days ago", etc.). 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Use {@link #toMillis(boolean)} to get the milliseconds. 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param millis the time in UTC milliseconds 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param gmtoff the offset from UTC in seconds 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the Julian day 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static int getJulianDay(long millis, long gmtoff) { 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long offsetMillis = gmtoff * 1000; 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long julianDay = (millis + offsetMillis) / DateUtils.DAY_IN_MILLIS; 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (int) julianDay + EPOCH_JULIAN_DAY; 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the time from the given Julian day number, which must be based on 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the same timezone that is set in this Time object. The "gmtoff" field 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * need not be initialized because the given Julian day may have a different 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * GMT offset than whatever is currently stored in this Time object anyway. 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * After this method returns all the fields will be normalized and the time 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be set to 12am at the beginning of the given Julian day. 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The only exception to this is if 12am does not exist for that day because 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of daylight saving time. For example, Cairo, Eqypt moves time ahead one 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * hour at 12am on April 25, 2008 and there are a few other places that 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * also change daylight saving time at 12am. In those cases, the time 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be set to 1am. 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param julianDay the Julian day in the timezone for this Time object 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the UTC milliseconds for the beginning of the Julian day 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long setJulianDay(int julianDay) { 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Don't bother with the GMT offset since we don't know the correct 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // value for the given Julian day. Just get close and then adjust 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the day. 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long millis = (julianDay - EPOCH_JULIAN_DAY) * DateUtils.DAY_IN_MILLIS; 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project set(millis); 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Figure out how close we are to the requested Julian day. 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We can't be off by more than a day. 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int approximateDay = getJulianDay(millis, gmtoff); 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int diff = julianDay - approximateDay; 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project monthDay += diff; 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Set the time to 12am and re-normalize. 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hour = 0; 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project minute = 0; 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project second = 0; 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project millis = normalize(true); 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return millis; 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 774