ucar.nc2.units.DateFromString Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of netcdf Show documentation
Show all versions of netcdf Show documentation
The NetCDF-Java Library is a Java interface to NetCDF files,
as well as to many other types of scientific data formats.
The newest version!
/*
* Copyright 1998-2009 University Corporation for Atmospheric Research/Unidata
*
* Portions of this software were developed by the Unidata Program at the
* University Corporation for Atmospheric Research.
*
* Access and use of this software shall impose the following obligations
* and understandings on the user. The user is granted the right, without
* any fee or cost, to use, copy, modify, alter, enhance and distribute
* this software, and any derivative works thereof, and its supporting
* documentation for any purpose whatsoever, provided that this entire
* notice appears in all copies of the software, derivative works and
* supporting documentation. Further, UCAR requests that the user credit
* UCAR/Unidata in any publications that result from the use of this
* software or in any product that includes this software. The names UCAR
* and/or Unidata, however, may not be used in any advertising or publicity
* to endorse or promote any products or commercial entity unless specific
* written permission is obtained from UCAR/Unidata. The user also
* understands that UCAR/Unidata is not obligated to provide the user with
* any support, consulting, training or assistance of any kind with regard
* to the use, operation and performance of this software nor to provide
* the user with any updates, revisions, new versions or "bug fixes."
*
* THIS SOFTWARE IS PROVIDED BY UCAR/UNIDATA "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL UCAR/UNIDATA BE LIABLE FOR ANY SPECIAL,
* INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
* FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
* WITH THE ACCESS, USE OR PERFORMANCE OF THIS SOFTWARE.
*/
package ucar.nc2.units;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
import java.text.SimpleDateFormat;
import java.text.ParseException;
/**
* Convenience routines for parsing a String to produce a Date.
*
* @author edavis
* @since Nov 29, 2005 4:53:46 PM
*/
public class DateFromString {
static private final Logger logger = LoggerFactory.getLogger(DateFromString.class);
/**
* Parse the given date string (starting at the first numeric character)
* using the given date format string (as described in
* java.text.SimpleDateFormat) and return a Date.
*
* @param dateString the String to be parsed
* @param dateFormatString the date format String
* @return the Date that was parsed.
*/
public static Date getDateUsingSimpleDateFormat( String dateString, String dateFormatString )
{
// Determine first numeric character in dateString and drop proceeding characters.
int smallestIndex = dateString.length();
if ( smallestIndex == 0 ) return null;
for ( int i = 0; i < 10; i++ )
{
int curIndex = dateString.indexOf( String.valueOf( i ) );
if ( curIndex != -1 && smallestIndex > curIndex )
smallestIndex = curIndex;
}
return getDateUsingCompleteDateFormatWithOffset( dateString, dateFormatString, smallestIndex );
}
/**
* Parse the given date string, starting at a position given by the offset of the demark character in the dateFormatString.
* The rest of the dateFormatString is the date format string (as described in java.text.SimpleDateFormat).
* Example:
* dateString = wrfout_d01_2006-07-06_080000.nc
* dateFormatString = wrfout_d01_#yyyy-MM-dd_HHmm
*
* This simple counts over "wrfout_d01_" number of chars in dateString, then applies the remaining dateFormatString.
*
* @param dateString the String to be parsed
* @param dateFormatString the date format String
* @param demark the demarkation character
* @return the Date that was parsed.
*/
public static Date getDateUsingDemarkatedCount( String dateString, String dateFormatString, char demark )
{
// the position of the demark char is where to start parsing the dateString
int pos1 = dateFormatString.indexOf( demark);
// the rest of the dateFormatString is the SimpleDateFOrmat
dateFormatString = dateFormatString.substring( pos1+1);
return getDateUsingCompleteDateFormatWithOffset( dateString, dateFormatString, pos1 );
}
/**
* Parse the given date string (between the demarcation characters)
* using the given date format string (as described in
* java.text.SimpleDateFormat) and return a Date.
*
* Example:
* dateString = /data/anything/2006070611/wrfout_d01_2006-07-06_080000.nc
* dateFormatString = #wrfout_d01_#yyyy-MM-dd_HHmm
* would extract the date 2006-07-06T08:00
*
* dateString = /data/anything/2006070611/wrfout_d01_2006-07-06_080000.nc
* dateFormatString = yyyyMMddHH#/wrfout_d01_#
* would extract the date 2006-07-06T11:00
*
*
* @param dateString the String to be parsed
* @param dateFormatString the date format String
* @param demark the demarkation character
* @return the Date that was parsed.
*/
public static Date getDateUsingDemarkatedMatch( String dateString, String dateFormatString, char demark )
{
// extract the match string
int pos1 = dateFormatString.indexOf( demark);
int pos2 = dateFormatString.indexOf( demark, pos1+1);
if ((pos1 < 0) || (pos2 < 0)) {
logger.error("Must delineate Date between 2 '#' chars, dateFormatString = "+ dateFormatString);
return null;
}
String match = dateFormatString.substring(pos1+1, pos2);
int pos3 = dateString.indexOf(match);
if (pos3 < 0) return null;
if (pos1 > 0) {
dateFormatString = dateFormatString.substring(0, pos1);
dateString = dateString.substring(pos3-dateFormatString.length(), pos3);
} else {
dateFormatString = dateFormatString.substring(pos2+1);
dateString = dateString.substring(pos3+match.length());
}
return getDateUsingCompleteDateFormatWithOffset( dateString, dateFormatString, 0 );
}
public static Double getHourUsingDemarkatedMatch( String hourString, String formatString, char demark )
{
// extract the match string
int pos1 = formatString.indexOf( demark);
int pos2 = formatString.indexOf( demark, pos1+1);
if ((pos1 < 0) || (pos2 < 0)) return null;
String match = formatString.substring(pos1+1, pos2);
// where does it live in the hour string ?
int pos3 = hourString.indexOf(match);
if (pos3 < 0) return null;
// for now, just match the number of chars
if (pos1 > 0) {
hourString = hourString.substring(pos3-pos1, pos3);
} else {
int len = formatString.length() - pos2 - 1;
int start = pos3 + match.length();
hourString = hourString.substring(start, start+len);
}
return Double.valueOf( hourString);
}
/**
* Parse the given date string using the given date format string (as
* described in java.text.SimpleDateFormat) and return a Date.
*
* @param dateString the String to be parsed
* @param dateFormatString the date format String
* @return the Date that was parsed.
*/
public static Date getDateUsingCompleteDateFormat( String dateString, String dateFormatString )
{
return getDateUsingCompleteDateFormatWithOffset( dateString, dateFormatString, 0 );
}
/**
* Parse the given date string (starting at the given startIndex) using the
* given date format string (as described in java.text.SimpleDateFormat) and
* return a Date. Assumes TimeZone is GMT.
*
* @param dateString the String to be parsed
* @param dateFormatString the date format String
* @param startIndex the index at which to start parsing the date string
* @return the Date that was parsed.
*/
public static Date getDateUsingCompleteDateFormatWithOffset( String dateString, String dateFormatString, int startIndex )
{
try {
SimpleDateFormat dateFormat = new SimpleDateFormat( dateFormatString, Locale.US );
dateFormat.setTimeZone( TimeZone.getTimeZone( "GMT" ) );
// We have to cut off the dateString, so that it doesnt grab extra characters.
// ie new SimpleDateFormat("yyyyMMdd_HH").parse("20061129_06") -> 2006-12-24T00:00:00Z (WRONG!)
String s;
if (startIndex + dateFormatString.length() <= dateString.length())
s = dateString.substring( startIndex, startIndex + dateFormatString.length());
else
s = dateString;
Date result = dateFormat.parse( s );
if (result == null)
throw new RuntimeException("SimpleDateFormat bad ="+dateFormatString+" working on ="+s);
return result;
} catch (ParseException e) {
throw new RuntimeException("SimpleDateFormat = "+dateFormatString+" fails on "+ dateString+ " ParseException:"+e.getMessage());
} catch (IllegalArgumentException e) {
throw new RuntimeException("SimpleDateFormat = "+dateFormatString+" fails on "+ dateString+ " IllegalArgumentException:"+e.getMessage());
}
}
/**
* Use regular expression capture group replacement to construct a date
* string and return the Date that is obtained by parseing the constructed
* date string using the date format string "yyyy-MM-dd'T'HH:mm".
*
* The date string is constructed by matching the given dateString against
* the given regular expression matchPattern and then using the capture
* groups from the match to replace the capture group references, i.e., "$n", where n is an
* integer.
*
* @param dateString the String to be parsed
* @param matchPattern the regular expression String on which to match.
* @param substitutionPattern the String to use in the capture group replacement.
* @return the calculated Date
*/
public static Date getDateUsingRegExp( String dateString,
String matchPattern,
String substitutionPattern )
{
String dateFormatString = "yyyy-MM-dd'T'HH:mm";
return getDateUsingRegExpAndDateFormat( dateString,
matchPattern,
substitutionPattern,
dateFormatString );
}
/**
* The same as getDateUsingRegExp() except the date format string to be used
* must be specified.
*
* @param dateString the String to be parsed
* @param matchPattern the regular expression String on which to match.
* @param substitutionPattern the String to use in the capture group replacement.
* @param dateFormatString the date format string to use in the parsing of the date string.
* @return the calculated Date
*/
public static Date getDateUsingRegExpAndDateFormat( String dateString,
String matchPattern,
String substitutionPattern,
String dateFormatString )
{
// Match the given date string against the regular expression.
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile( matchPattern );
java.util.regex.Matcher matcher = pattern.matcher( dateString );
if ( ! matcher.matches() )
{
return null;
}
// Build date string to use with date format string by
// substituting the capture groups into the substitution pattern.
StringBuffer dateStringFormatted = new StringBuffer();
matcher.appendReplacement( dateStringFormatted, substitutionPattern );
if ( dateStringFormatted.length() == 0 )
{
return null;
}
return getDateUsingCompleteDateFormat( dateStringFormatted.toString(), dateFormatString );
}
public static void main(String args[]) throws ParseException {
/* dateString = /data/anything/2006070611/wrfout_d01_2006-07-06_080000.nc
* dateFormatString = #wrfout_d01_#yyyy-MM-dd_HHmm
* would extract the date 2006-07-06T08:00
*
* dateString = /data/anything/2006070611/wrfout_d01_2006-07-06_080000.nc
* dateFormatString = yyyyMM-ddHH#/wrfout_d01_#
* would extract the date 2006-07-06T11:00
*
*
* @param dateString the String to be parsed
* @param dateFormatString the date format String
* @return the Date that was parsed.
*/
DateFormatter formatter = new DateFormatter();
Date result = getDateUsingDemarkatedMatch( "/data/anything/2006070611/wrfout_d01_2006-07-06_080000.nc", "#wrfout_d01_#yyyy-MM-dd_HHmm", '#' );
System.out.println(" 2006-07-06_080000 -> "+formatter.toDateTimeStringISO( result));
result = getDateUsingDemarkatedMatch( "C:\\data\\nomads\\gfs-hi\\gfs_3_20061129_0600", "#gfs_3_#yyyyMMdd_HH", '#' );
System.out.println(" 20061129_06 -> "+formatter.toDateTimeStringISO( result));
System.out.println(new SimpleDateFormat("yyyyMMdd_HH").parse("20061129_06"));
System.out.println(new SimpleDateFormat("yyyyMMdd_HH").parse("20061129_0600"));
}
}