blob: 9f6cc5ab9df4e63c8efc3279f124c30ab82ec233 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one or more contributor
// license agreements. See the NOTICE.txt file distributed with this work for
// additional information regarding copyright ownership. The ASF licenses this
// file to you under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
package org.apache.oodt.commons.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
/**
The <code>DateConvert</code> class is intended to provide date/time
conversion and parse routines. For a description of the syntax of the
format strings see {@link SimpleDateFormat}.
@author S. Hardman
@version $Revision: 1.1.1.1 $
*/
public class DateConvert {
/**
The number of milliseconds in a minute.
*/
private final static long MS_IN_MINUTE = 60000;
/**
The number of milliseconds in an hour.
*/
private final static long MS_IN_HOUR = 3600000;
/**
The number of milliseconds in a day.
*/
private final static long MS_IN_DAY = 86400000;
/**
The format string representing the ISO 8601 format. The format
is close to CCSDS ASCII Time Code A.
*/
private final static String ISO_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS";
/**
The format string representing the CCSDS ASCII Time Code B format
excluding the trailing "Z".
*/
private final static String DOY_FORMAT = "yyyy-DDD'T'HH:mm:ss.SSS";
/**
The format string representing the EDA time stamp format.
*/
private final static String TS_FORMAT = "yyyyMMddHHmmssSSS";
/**
The format string representing the DBMS format.
*/
private final static String DBMS_FORMAT = "dd-MMM-yyyy HH:mm:ss";
/**
The format string representing the Year-Month-Day format.
*/
private final static String YMD_FORMAT = "yyyy-MM-dd";
/**
Constructor given no arguments.
This is a static-only class that may not be instantiated.
@throws IllegalStateException If the class is instantiated.
*/
public DateConvert() throws IllegalStateException {
throw new IllegalStateException("Instantiation of this class is not allowed.");
}
/**
Format the given date and return the resulting string in ISO 8601 format.
The format is as follows: "yyyy-MM-dd'T'HH:mm:ss.SSS[Z|[+|-]HH:mm]".
@param inputDate The date to be converted into string format.
@return The formatted date/time string.
*/
public static String isoFormat(Date inputDate) {
// Setup the date format and convert the given date.
SimpleDateFormat dateFormat = new SimpleDateFormat(ISO_FORMAT);
String dateString = dateFormat.format(inputDate);
// Determine the time zone and concatenate the time zone designator
// onto the formatted date/time string.
TimeZone tz = dateFormat.getTimeZone();
String tzName = tz.getDisplayName();
if (tzName.equals("Greenwich Mean Time")) {
dateString = dateString.concat("Z");
}
else {
// Determine the hour offset. Add an hour if daylight savings
// is in effect.
long tzOffsetMS = tz.getRawOffset();
long tzOffsetHH = tzOffsetMS / MS_IN_HOUR;
if (tz.inDaylightTime(inputDate)) {
tzOffsetHH = tzOffsetHH + 1;
}
String hourString = String.valueOf(Math.abs(tzOffsetHH));
if (hourString.length() == 1) {
hourString = "0" + hourString;
}
// Determine the minute offset.
long tzOffsetMMMS = tzOffsetMS % MS_IN_HOUR;
long tzOffsetMM = 0;
if (tzOffsetMMMS != 0) {
tzOffsetMM = tzOffsetMMMS / MS_IN_MINUTE;
}
String minuteString = String.valueOf(tzOffsetMM);
if (minuteString.length() == 1) {
minuteString = "0" + minuteString;
}
// Determine the sign of the offset.
String sign = "+";
if (String.valueOf(tzOffsetMS).indexOf("-") != -1) {
sign = "-";
}
dateString = dateString.concat(sign + hourString + ":" + minuteString);
}
return(dateString);
}
/**
Parse the given date/time string in ISO 8601 format and return the
resulting <code>Date</code> object.
The format is as follows: "yyyy-MM-dd'T'HH:mm:ss.SSS[Z|[+|-]HH:mm]".
@param inputString The string to be parsed.
@return The resulting Date object.
@throws ParseException If the string is null or does not match the date/time
format.
*/
public static Date isoParse(String inputString) throws ParseException {
// Setup the date format.
SimpleDateFormat dateFormat = new SimpleDateFormat(ISO_FORMAT);
dateFormat.setLenient(false);
// The length of the input string should be at least 24 characters.
if (inputString == null || inputString.length() < 24) {
throw new ParseException("An exception occurred because the input date/time string was null or under 24 characters in length.", inputString.length());
}
// Evaluate the the specified offset and set the time zone.
String offsetString = inputString.substring(23);
if (offsetString.equals("Z")) {
dateFormat.setTimeZone(TimeZone.getTimeZone("Greenwich Mean Time"));
}
else if (offsetString.startsWith("-") || offsetString.startsWith("+")) {
SimpleDateFormat offsetFormat = new SimpleDateFormat();
if (offsetString.length() == 3) {
offsetFormat.applyPattern("HH");
}
else if (offsetString.length() == 6) {
offsetFormat.applyPattern("HH:mm");
}
else {
throw new ParseException("An exception occurred because the offset portion was not the valid length of 3 or 6 characters.", 25);
}
// Validate the given offset.
offsetFormat.setLenient(false);
Date offsetDate = offsetFormat.parse(offsetString.substring(1));
// Set the time zone with the validated offset.
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT" + offsetString));
}
else {
throw new ParseException("An exception occurred because the offset portion of the input date/time string was not 'Z' or did not start with '+' or '-'.", 24);
}
// Parse the given string.
Date parseDate = dateFormat.parse(inputString);
return(parseDate);
}
/**
Format the given date and return the resulting string in CCSDS
ASCII Time Code B format.
The format is as follows: "yyyy-DDD'T'HH:mm:ss.SSS".
@param inputDate The date to be converted into string format.
@return The formatted date/time string.
*/
public static String doyFormat(Date inputDate) {
// Setup the date format and convert the given date.
SimpleDateFormat dateFormat = new SimpleDateFormat(DOY_FORMAT);
String dateString = dateFormat.format(inputDate);
return(dateString);
}
/**
Parse the given date/time string in CCSDS ASCII Time Code B format
and return the resulting <code>Date</code> object.
The format is as follows: "yyyy-DDD'T'HH:mm:ss.SSS".
@param inputString The string to be parsed.
@return The resulting Date object.
@throws ParseException If the string does not match the date/time
format.
*/
public static Date doyParse(String inputString) throws ParseException {
// Setup the date format and parse the given string.
SimpleDateFormat dateFormat = new SimpleDateFormat(DOY_FORMAT);
dateFormat.setLenient(false);
Date parseDate = dateFormat.parse(inputString);
return(parseDate);
}
/**
Format the given date and return the resulting string in a timestamp
format.
The format is as follows: "yyyyMMddHHmmssSSS".
@param inputDate The date to be converted into string format.
@return The formatted date/time string.
*/
public static String tsFormat(Date inputDate) {
// Setup the date format and convert the given date.
SimpleDateFormat dateFormat = new SimpleDateFormat(TS_FORMAT);
String dateString = dateFormat.format(inputDate);
return(dateString);
}
/**
Parse the given date/time string in timestamp format
and return the resulting <code>Date</code> object.
The format is as follows: "yyyyMMddHHmmssSSS".
@param inputString The string to be parsed.
@return The resulting Date object.
@throws ParseException If the string does not match the date/time
format.
*/
public static Date tsParse(String inputString) throws ParseException {
// Setup the date format and parse the given string.
SimpleDateFormat dateFormat = new SimpleDateFormat(TS_FORMAT);
dateFormat.setLenient(false);
Date parseDate = dateFormat.parse(inputString);
return(parseDate);
}
/**
Format the given date and return the resulting string in a DBMS
format.
The format is as follows: "dd-MMM-yyyy HH:mm:ss".
@param inputDate The date to be converted into string format.
@return The formatted date/time string.
*/
public static String dbmsFormat(Date inputDate) {
// Setup the date format and convert the given date.
SimpleDateFormat dateFormat = new SimpleDateFormat(DBMS_FORMAT);
String dateString = dateFormat.format(inputDate);
return(dateString);
}
/**
Parse the given date/time string in DBMS format
and return the resulting <code>Date</code> object.
The format is as follows: "dd-MMM-yyyy HH:mm:ss".
@param inputString The string to be parsed.
@return The resulting Date object.
@throws ParseException If the string does not match the date/time
format.
*/
public static Date dbmsParse(String inputString) throws ParseException {
// Setup the date format and parse the given string.
SimpleDateFormat dateFormat = new SimpleDateFormat(DBMS_FORMAT);
dateFormat.setLenient(false);
Date parseDate = dateFormat.parse(inputString);
return(parseDate);
}
/**
Format the given date and return the resulting string in a
year-month-day format.
The format is as follows: "yyyy-MM-dd".
@param inputDate The date to be converted into string format.
@return The formatted date/time string.
*/
public static String ymdFormat(Date inputDate) {
// Setup the date format and convert the given date.
SimpleDateFormat dateFormat = new SimpleDateFormat(YMD_FORMAT);
String dateString = dateFormat.format(inputDate);
return(dateString);
}
/**
Parse the given date/time string in year-month-day format
and return the resulting <code>Date</code> object.
The format is as follows: "yyyy-MM-dd".
@param inputString The string to be parsed.
@return The resulting Date object.
@throws ParseException If the string does not match the date/time
format.
*/
public static Date ymdParse(String inputString) throws ParseException {
// Setup the date format and parse the given string.
SimpleDateFormat dateFormat = new SimpleDateFormat(YMD_FORMAT);
dateFormat.setLenient(false);
Date parseDate = dateFormat.parse(inputString);
return(parseDate);
}
/**
Get the number of milliseconds in a minute.
@return The number of milliseconds in a minute.
*/
public static long getMsecsInMinute() {
return(MS_IN_MINUTE);
}
/**
Get the number of milliseconds in an hour.
@return The number of milliseconds in an hour.
*/
public static long getMsecsInHour() {
return(MS_IN_HOUR);
}
/**
Get the number of milliseconds in a day.
@return The number of milliseconds in a day.
*/
public static long getMsecsInDay() {
return(MS_IN_DAY);
}
}