java.fedora.server.utilities.DateUtility Maven / Gradle / Ivy
Show all versions of fcrepo-client Show documentation
/*
* -----------------------------------------------------------------------------
*
* License and Copyright: The contents of this file are subject to 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.fedora-commons.org/licenses.
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
*
* The entire file consists of original code.
* Copyright © 2008 Fedora Commons, Inc.
*
Copyright © 2002-2007 The Rector and Visitors of the University of
* Virginia and Cornell University
* All rights reserved.
*
* -----------------------------------------------------------------------------
*/
/*
* The contents of this file are subject to the license and copyright terms
* detailed in the license directory at the root of the source tree (also
* available online at http://www.fedora.info/license/).
*/
package fedora.server.utilities;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
/**
*
*
* Title: DateUtility.java
*
*
* Description: A collection of utility methods for performing
*
*
* frequently required tasks.
*
*
* @author [email protected]
* @version $Id: DateUtility.java 6425 2007-12-17 17:17:27Z pangloss $
*/
public abstract class DateUtility {
private static final Date ONE_BCE = new Date(-62167392000000L);
private static final Date ONE_CE = new Date(-62135769600000L);
/**
*
* Converts a datetime string into and instance of java.util.Date using the
* date format: yyyy-MM-ddTHH:mm:ss.SSSZ.
*
*
*
* Follows Postel's Law (lenient about what it accepts, as long as it's
* sensible)
*
*
* @param dateTime
* A datetime string
* @return Corresponding instance of java.util.Date (returns null if
* dateTime string argument is empty string or null)
*/
public static Date convertStringToDate(String dateTime) {
return parseDateAsUTC(dateTime);
}
/**
*
* Converts an instance of java.util.Date into a String using the date
* format: yyyy-MM-ddTHH:mm:ss.SSSZ.
*
*
* @param date
* Instance of java.util.Date.
* @return ISO 8601 String representation (yyyy-MM-ddTHH:mm:ss.SSSZ) of the
* Date argument or null if the Date argument is null.
*/
public static String convertDateToString(Date date) {
return convertDateToString(date, true);
}
/**
* Converts an instance of java.util.Date into an ISO 8601 String
* representation. Uses the date format yyyy-MM-ddTHH:mm:ss.SSSZ or
* yyyy-MM-ddTHH:mm:ssZ, depending on whether millisecond precision is
* desired.
*
* @param date
* Instance of java.util.Date.
* @param millis
* Whether or not the return value should include milliseconds.
* @return ISO 8601 String representation of the Date argument or null if
* the Date argument is null.
*/
public static String convertDateToString(Date date, boolean millis) {
if (date == null) {
return null;
} else {
DateFormat df;
if (millis) {
df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
} else {
df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
}
df.setTimeZone(TimeZone.getTimeZone("UTC"));
if (date.before(ONE_CE)) {
StringBuilder sb = new StringBuilder(df.format(date));
sb.insert(0, "-");
return sb.toString();
} else {
return df.format(date);
}
}
}
/**
* Converts an instance of Date
into the canonical lexical
* representation of an XSD dateTime with the following exceptions:
* - Dates before 1 CE (i.e. 1 AD) are handled according to ISO 8601:2000
* Second Edition:
* "0000" is the lexical representation of 1 BCE
* "-0001" is the lexical representation of 2 BCE
*
* @param date Instance of java.util.Date.
* @return the lexical form of the XSD dateTime value, e.g. "2006-11-13T09:40:55.001Z".
* @see 3.2.7.2 Canonical representation
*
*/
public static String convertDateToXSDString(Date date) {
if (date == null) return null;
StringBuilder lexicalForm;
String dateTime = convertDateToString(date, true);
int len = dateTime.length() - 1;
if (dateTime.indexOf('.', len - 4) != -1) {
while (dateTime.charAt(len - 1) == '0') {
len--; // fractional seconds may not with '0'.
}
if (dateTime.charAt(len - 1) == '.') {
len--;
}
lexicalForm = new StringBuilder(dateTime.substring(0, len));
lexicalForm.append('Z');
} else {
lexicalForm = new StringBuilder(dateTime);
}
if (date.before(ONE_CE)) {
DateFormat df = new SimpleDateFormat("yyyy");
df.setTimeZone(TimeZone.getTimeZone("UTC"));
StringBuilder year = new StringBuilder(String.valueOf(Integer
.parseInt(df.format(date)) - 1));
while (year.length() < 4) {
year.insert(0, '0');
}
lexicalForm
.replace(0, lexicalForm.indexOf("-", 4), year.toString());
if (date.before(ONE_BCE)) {
lexicalForm.insert(0, "-");
}
}
return lexicalForm.toString();
}
/**
*
* Converts an instance of java.util.Date into a String using the date
* format: yyyy-MM-ddZ.
*
*
* @param date
* Instance of java.util.Date.
* @return Corresponding date string (returns null if Date argument is
* null).
*/
public static String convertDateToDateString(Date date) {
if (date == null) {
return null;
} else {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'Z'");
df.setTimeZone(TimeZone.getTimeZone("UTC"));
return df.format(date);
}
}
/**
*
* Converts an instance of java.util.Date into a String using the date
* format: HH:mm:ss.SSSZ.
*
*
* @param date
* Instance of java.util.Date.
* @return Corresponding time string (returns null if Date argument is
* null).
*/
public static String convertDateToTimeString(Date date) {
if (date == null) {
return null;
} else {
DateFormat df = new SimpleDateFormat("HH:mm:ss.SSS'Z'");
df.setTimeZone(TimeZone.getTimeZone("UTC"));
return df.format(date);
}
}
/**
* Attempt to parse the given string of form: yyyy-MM-dd[THH:mm:ss[.SSS][Z]]
* as a Date. If the string is not of that form, return null.
*
* @param dateString
* the date string to parse
* @return Date the date, if parse was successful; null otherwise
*/
public static Date parseDateAsUTC(String dateString) {
if (dateString == null || dateString.length() == 0) {
return null;
}
SimpleDateFormat formatter = new SimpleDateFormat();
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
int length = dateString.length();
if (dateString.startsWith("-")) {
length--;
}
if (dateString.endsWith("Z")) {
if (length == 11) {
formatter.applyPattern("yyyy-MM-dd'Z'");
} else if (length == 20) {
formatter.applyPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");
} else if (length == 22) {
formatter.applyPattern("yyyy-MM-dd'T'HH:mm:ss.S'Z'");
} else if (length == 23) {
formatter.applyPattern("yyyy-MM-dd'T'HH:mm:ss.SS'Z'");
} else if (length == 24) {
formatter.applyPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
}
} else {
if (length == 10) {
formatter.applyPattern("yyyy-MM-dd");
} else if (length == 19) {
formatter.applyPattern("yyyy-MM-dd'T'HH:mm:ss");
} else if (length == 21) {
formatter.applyPattern("yyyy-MM-dd'T'HH:mm:ss.S");
} else if (length == 22) {
formatter.applyPattern("yyyy-MM-dd'T'HH:mm:ss.SS");
} else if (length == 23) {
formatter.applyPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
} else if (dateString.endsWith("GMT") || dateString.endsWith("UTC")) {
formatter.applyPattern("EEE, dd MMMM yyyyy HH:mm:ss z");
}
}
try {
return formatter.parse(dateString);
} catch (ParseException e) {
return null;
}
}
}