Description
Returns date that is represented by a string.
License
Open Source License
Parameter
Parameter | Description |
---|
strDate | String representation of date. |
Exception
Parameter | Description |
---|
ParseException | if <code>strDate</code> is in an invalid format. |
Declaration
public static Date stringToDate(String strDate) throws ParseException
Method Source Code
//package com.java2s;
/**//from w w w .j ava2s .c o m
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 2006 Sun Microsystems Inc. All Rights Reserved
*
* The contents of this file are subject to the terms
* of the Common Development and Distribution License
* (the License). You may not use this file except in
* compliance with the License.
*
* You can obtain a copy of the License at
* https://opensso.dev.java.net/public/CDDLv1.0.html or
* opensso/legal/CDDLv1.0.txt
* See the License for the specific language governing
* permission and limitations under the License.
*
* When distributing Covered Code, include this CDDL
* Header Notice in each file and include the License file
* at opensso/legal/CDDLv1.0.txt.
* If applicable, add the following below the CDDL Header,
* with the fields enclosed by brackets [] replaced by
* your own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
*
* $Id: DateUtils.java,v 1.2 2008-06-25 05:53:00 qcheng Exp $
*
*/
import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;
public class Main {
private static final TimeZone UTC_TIME_ZONE = TimeZone.getTimeZone("UTC");
/**
* Returns date that is represented by a string. It uses the following
* representation of date. yyyy-MM-DD'T'hh:mm:ss based on the following
* definition of "dateTime" attribute in XML schema which can be found at
* http://www.w3.org/TR/xmlschema-2/#dateTime. A single lexical
* representation, which is a subset of the lexical representations allowed
* by [ISO 8601], is allowed for dateTime. This lexical representation is
* the [ISO 8601] extended format CCYY-MM-DDThh:mm:ss where "CC" represents
* the century, "YY" the year, "MM" the month and "DD" the day, preceded by
* an optional leading "-" sign to indicate a negative number. If the sign
* is omitted, "+" is assumed. The letter "T" is the date/time separator and
* "hh", "mm", "ss" represent hour, minute and second respectively.
* Additional digits can be used to increase the precision of fractional
* seconds if desired i.e the format ss.ss... with any number of digits
* after the decimal point is supported. The fractional seconds part is
* optional; other parts of the lexical form are not optional. To
* accommodate year values greater than 9999 additional digits can be added
* to the left of this representation. Leading zeros are required if the
* year value would otherwise have fewer than four digits; otherwise they
* are forbidden. The year 0000 is prohibited. The CCYY field must have at
* least four digits, the MM, DD, SS, hh, mm and ss fields exactly two
* digits each (not counting fractional seconds); leading zeroes must be
* used if the field would otherwise have too few digits.
*
* This representation may be immediately followed by a "Z" to indicate
* Coordinated Universal Time (UTC) or, to indicate the time zone, i.e. the
* difference between the local time and Coordinated Universal Time,
* immediately followed by a sign, + or -, followed by the difference from
* UTC represented as hh:mm (note: the minutes part is required). See ISO
* 8601 Date and Time Formats ('D) for details about legal values in the
* various fields. If the time zone is included, both hours and minutes must
* be present.
*
* For example, to indicate 1:20 pm on May the 31st, 1999 for Eastern
* Standard Time which is 5 hours behind Coordinated Universal Time (UTC),
* one would write: 1999-05-31T13:20:00-05:00.
*
* @param strDate String representation of date.
* @throws ParseException if <code>strDate</code> is in an invalid format.
*/
public static Date stringToDate(String strDate) throws ParseException {
int[] diffTime = null;
boolean plusTime = true;
// get time differences (if any)
int idxT = strDate.indexOf('T');
if (idxT == -1) {
throw new ParseException("Invalid Date Format", 0);
}
int idxDiffUTC = strDate.indexOf('-', idxT);
if (idxDiffUTC == -1) {
idxDiffUTC = strDate.indexOf('+', idxT);
plusTime = false;
}
if (idxDiffUTC != -1) {
diffTime = getDiffTime(strDate, idxDiffUTC);
strDate = strDate.substring(0, idxDiffUTC);
}
int idxMilliSec = strDate.indexOf('.');
if (idxMilliSec != -1) {
strDate = strDate.substring(0, idxMilliSec);
} else {
// remove the trailing z/Z character
char lastChar = strDate.charAt(strDate.length() - 1);
if ((lastChar == 'z') || (lastChar == 'Z')) {
strDate = strDate.substring(0, strDate.length() - 1);
}
}
return createDate(strDate, diffTime, plusTime);
}
/**
* Returns the difference portion of a date string. Array of integer with
* the first element defining the hour difference; and second element
* defining the minute difference
*
* @param strDate Date String.
* @param idx Index of the +/- character.
* @returns the difference portion of a date string.
* @throws ParseException if <code>strDate</code> is in an invalid format.
*/
private static int[] getDiffTime(String strDate, int idx) throws ParseException {
// discard the plus/minus char and trailing z char.
String strDiff = strDate.substring(idx + 1, strDate.length() - 1);
int[] diffArray = new int[2];
int colonIdx = strDiff.indexOf(':');
if (colonIdx == -1) {
throw new ParseException("Invalid Date Format", 0);
}
try {
diffArray[0] = Integer.parseInt(strDiff.substring(0, colonIdx));
diffArray[1] = Integer.parseInt(strDiff.substring(colonIdx + 1));
} catch (NumberFormatException nfe) {
throw new ParseException("Invalid Date Format", 0);
}
return diffArray;
}
/**
* Returns a date with a string of yyyy-MM-ssThh:mm:ss or yyyy-MM-ssThh:mm.
*
* @param strDate String representation of a date.
* @param timeDiff Time differences
* @param plusDiff Time differences (plus/minus). true indicates do a plus
* to the computed date. Ignore this value if <code>timeDiff</code>
* is null.
*/
private static Date createDate(String strDate, int[] timeDiff, boolean plusDiff) throws ParseException {
try {
int year = Integer.parseInt(strDate.substring(0, 4));
if (strDate.charAt(4) != '-') {
throw new ParseException("Invalid Date Format", 0);
}
int month = Integer.parseInt(strDate.substring(5, 7)) - 1;
if (strDate.charAt(7) != '-') {
throw new ParseException("Invalid Date Format", 0);
}
int day = Integer.parseInt(strDate.substring(8, 10));
if (strDate.charAt(10) != 'T') {
throw new ParseException("Invalid Date Format", 0);
}
int hour = Integer.parseInt(strDate.substring(11, 13));
if (strDate.charAt(13) != ':') {
throw new ParseException("Invalid Date Format", 0);
}
int minute = Integer.parseInt(strDate.substring(14, 16));
int second = 0;
if (strDate.length() > 17) {
if (strDate.charAt(16) != ':') {
throw new ParseException("Invalid Date Format", 0);
}
second = Integer.parseInt(strDate.substring(17, 19));
}
GregorianCalendar cal = new GregorianCalendar(year, month, day, hour, minute, second);
cal.setTimeZone(UTC_TIME_ZONE);
if (timeDiff != null) {
int hourDiff = (plusDiff) ? timeDiff[0] : (-1 * timeDiff[0]);
int minuteDiff = (plusDiff) ? timeDiff[1] : (-1 * timeDiff[1]);
cal.add(Calendar.HOUR, hourDiff);
cal.add(Calendar.MINUTE, minuteDiff);
}
return cal.getTime();
} catch (NumberFormatException nfe) {
throw new ParseException("Invalid Date Format", 0);
}
}
}
Related
- StringToDate(String str, String format)
- stringToDate(String str, String format)
- stringToDate(String str, String formatStr)
- stringToDate(String strDate)
- stringToDate(String strDate)
- stringToDate(String strDate)
- stringToDate(String strDate, String formartStr)
- stringToDate(String strDate, String oracleFormat)
- stringToDate(String strDate, String pattern)