public class DateConverter extends Object
Modifier and Type | Field and Description |
---|---|
static int |
INVALID_YEAR
Error value if date is invalid.
|
Modifier and Type | Method and Description |
---|---|
static void |
adjustTimeZoneNicely(GregorianCalendar cal,
TimeZone tz)
Install a TimeZone on a GregorianCalendar without changing the
hours value.
|
static String |
formatTZoffset(long millis,
String sep)
Formats a time zone offset as #hh^mm
where # is + or -, hh is hours, ^ is a separator, and mm is minutes.
|
static String[] |
getFormats()
Get all know formats.
|
static GregorianCalendar |
newGreg()
Construct a new GregorianCalendar and set defaults.
|
static GregorianCalendar |
parseBigEndianDate(String text,
ParsePosition initialWhere)
Parses a big-endian date: year month day hour min sec.
|
static Calendar |
parseDate(String text,
String[] moreFmts,
ParsePosition initialWhere)
Parses a String to see if it begins with a date, and if so,
returns that date.
|
static GregorianCalendar |
parseSimpleDate(String text,
String[] fmts,
ParsePosition initialWhere)
See if text can be parsed as a date according to any of a list of
formats.
|
static int |
parseTimeField(String text,
ParsePosition where,
int maxlen,
int remedy)
Parses an integer from a string, starting at and advancing a ParsePosition.
|
static boolean |
parseTZoffset(String text,
GregorianCalendar cal,
ParsePosition initialWhere)
Parses the end of a date string for a time zone and, if one is found,
sets the time zone of the GregorianCalendar.
|
static int |
restrainTZoffset(long proposedOffset)
Constrain a timezone offset to the range [-14:00 thru +14:00].
|
static char |
skipOptionals(String text,
ParsePosition where,
String optionals)
Advances the ParsePosition past any and all the characters
that match those in the optionals list.
|
static boolean |
skipString(String text,
String victim,
ParsePosition where)
If the victim string is at the given position in the text,
this method advances the position past that string.
|
static Calendar |
toCalendar(COSString text)
Deprecated.
This method throws an IOException for failure. Replace
calls to it with
toCalendar(String, String[])
and test for failure with
(value == null || value.get(Calendar.YEAR) == INVALID_YEAR) |
static Calendar |
toCalendar(String text)
Deprecated.
This method throws an IOException for failure. Replace
calls to it with
toCalendar(String, String[])
using nullfor the second parameter and test for failure with (value == null || value.get(Calendar.YEAR) == INVALID_YEAR) |
static Calendar |
toCalendar(String text,
String[] moreFmts)
Converts a string to a calendar.
|
static String |
toISO8601(Calendar cal)
Converts the date to ISO 8601 string format:
yyyy-mm-ddThh:MM:ss#hh:mm (where '#" is '+' or '-').
|
static String |
toString(Calendar cal)
Converts a Calendar to a string formatted as:
D:yyyyMMddHHmmss#hh'mm' where # is Z, +, or -.
|
public static final int INVALID_YEAR
public static String[] getFormats()
public static String toString(Calendar cal)
cal
- The date to convert to a string. May be null.
The DST_OFFSET is included when computing the output time zone.public static String toISO8601(Calendar cal)
cal
- The date to convert. Must not be null.
The DST_OFFSET is included in the output value.public static int restrainTZoffset(long proposedOffset)
proposedOffset
- A value intended to be a timezone offset.public static String formatTZoffset(long millis, String sep)
Take thought in choosing the source for the millis value. It can come from calendarValue.getTimeZone() or from calendarValue.get(Calendar.ZONE_OFFSET). If a TimeZone was created from a valid time zone ID, then it may have a daylight savings rule. (As of July 4, 2013, the data base at http://www.iana.org/time-zones recognized 629 time zone regions. But a TimeZone created as new SimpleTimeZone(millisOffset, "ID"), will not have a daylight savings rule. (Not even if there is a known time zone with the given ID. To get the TimeZone named "xDT" with its DST rule, use an ID of EST5EDT, CST6CDT, MST7MDT, or PST8PDT.
When parsing PDF dates, the incoming values DOES NOT have a TIMEZONE value. At most it has an OFFSET value like -04'00'. It is generally impossible to determine what TIMEZONE corresponds to a given OFFSET. If the date is in the summer when daylight savings is in effect, an offset of -0400 might correspond to any one of the 38 regions (of 53) with standard time offset -0400 and no daylight saving. Or it might correspond to any one of the 31 regions (out of 43) that observe daylight savings and have standard time offset of -0500.
If a Calendar has not been assigned a TimeZone with setTimeZone(), it will have by default the local TIMEZONE, not just the OFFSET. In the USA, this TimeZone will have a daylight savings rule.
The offset assigned with calVal.set(Calendar.ZONE_OFFSET) differs from the offset in the TimeZone set by Calendar.setTimeZone(). Example: Suppose my local TimeZone is America/New_York. It has an offset of -05'00'. And suppose I set a GregorianCalendar's ZONE_OFFSET to -07'00' calVal = new GregorianCalendar(); // TimeZone is the local default calVal.set(Calendar.ZONE_OFFSET, -7* MILLIS_PER_HOUR); Four different offsets can be computed from calVal: calVal.get(Calendar.ZONE_OFFSET) => -07:00 calVal.get(Calendar.ZONE_OFFSET) + calVal.get(Calendar.DST_OFFSET) => -06:00 calVal.getTimeZone().getRawOffset() => -05:00 calVal.getTimeZone().getOffset(calVal.getTimeInMillis()) => -04:00
Which is correct??? I dunno, though setTimeZone() does seem to affect
ZONE_OFFSET, and not vice versa. One cannot even test whether TimeZone
or ZONE_OFFSET has been set; both have been set by initialization code.
TimeZone is initialized to the local default time zone
and ZONE_OFFSET is set from it.
My choice in this DateConverter class has been to set the
initial TimeZone of a GregorianCalendar to GMT. Thereafter
the TimeZone is modified with adjustTimeZoneNicely(java.util.GregorianCalendar, java.util.TimeZone)
.
millis
- a time zone offset expressed in milliseconds
Any value is accepted; it is normalized to [-11:59 ... +11:59]sep
- a String to insert between hh and mm. May be empty.public static int parseTimeField(String text, ParsePosition where, int maxlen, int remedy)
text
- The string being parsed. If null, the remedy value is returned.where
- The ParsePosition to start the search. This value
will be incremented by the number of digits found, but no
more than maxlen. That is, the ParsePosition will
advance across at most maxlen initial digits in text.
The error index is ignored and unchanged.maxlen
- The maximum length of the integer to parse.
Usually 2, but 4 for year fields.
If the field of length maxlen begins with a digit,
but contains a non-digit, no error is signaled
and the integer value is returned.remedy
- Value to be assigned if no digit is found at the
initial parse position; that is, if the field is empty.public static char skipOptionals(String text, ParsePosition where, String optionals)
text
- The text to examinewhere
- index to start looking.
The value is incremented by the number of optionals found.
The error index is ignored and unchanged.optionals
- A String listing all the optional characters
to be skipped.public static boolean skipString(String text, String victim, ParsePosition where)
text
- The text to examinevictim
- The string to look forwhere
- The initial position to look at. After return, this will
have been incremented by the length of the victim if it was found.
The error index is ignored and unchanged.public static GregorianCalendar newGreg()
public static void adjustTimeZoneNicely(GregorianCalendar cal, TimeZone tz)
cal
- The GregorianCalendar whose TimeZone to change.tz
- The new TimeZone.public static boolean parseTZoffset(String text, GregorianCalendar cal, ParsePosition initialWhere)
text
- The text expected to begin with a time zone value,
possibly with leading or trailing spaces.cal
- The Calendar whose TimeZone to set.initialWhere
- where Scanning begins at where.index. After success, the returned
index is that of the next character after the recognized string.
The error index is ignored and unchanged.public static GregorianCalendar parseBigEndianDate(String text, ParsePosition initialWhere)
text
- The string to parse.initialWhere
- Where to begin the parse. On return the index
is advanced to just beyond the last character processed.
The error index is ignored and unchanged.public static GregorianCalendar parseSimpleDate(String text, String[] fmts, ParsePosition initialWhere)
text
- The text to be parsed.fmts
- A list of formats to be tried. The syntax is that for
SimpleDateFormat
initialWhere
- At start this is the position to begin
examining the text. Upon return it will have been
incremented to refer to the next non-space character after the date.
If no date was found, the value is unchanged.
The error index is ignored and unchanged.public static Calendar parseDate(String text, String[] moreFmts, ParsePosition initialWhere)
text
- The String that may begin with a date. Must not be null.
Initial spaces and "D:" are skipped over.moreFmts
- Additional formats to be tried after trying the
built-in formats.initialWhere
- where Parsing begins at the given position in text. If the
parse succeeds, the index of where is advanced to point
to the first unrecognized character.
The error index is ignored and unchanged.public static Calendar toCalendar(COSString text) throws IOException
toCalendar(String, String[])
and test for failure with
(value == null || value.get(Calendar.YEAR) == INVALID_YEAR)text
- The COSString representation of a date.IOException
- If the date string is not in the correct format.The returned value will have 0 for DST_OFFSET.
public static Calendar toCalendar(String text) throws IOException
toCalendar(String, String[])
using nullfor the second parameter and test for failure with (value == null || value.get(Calendar.YEAR) == INVALID_YEAR)
toCalendar(String, String[])
using nullfor the second parameter, but throws an IOException for failure. The returned value will have 0 for DST_OFFSET.
text
- The string representation of the calendar.IOException
- If the date string is non-null
and not a parseable date.public static Calendar toCalendar(String text, String[] moreFmts)
parseDate(java.lang.String, java.lang.String[], java.text.ParsePosition)
to do the actual parsing.
The returned value will have 0 for DST_OFFSET.text
- The text to parse. Initial spaces and "D:" are skipped over.moreFmts
- An Array of formats (as Strings) to try
in addition to the standard list.Copyright © 2002–2017 The Apache Software Foundation. All rights reserved.