package timeflow.format.field;
import java.text.*;
import java.util.*;
import timeflow.data.time.*;
public class DateTimeGuesser {
private DateTimeParser lastGoodFormat;
private static List<DateTimeParser> parsers=new ArrayList<DateTimeParser>();
/*
HANDY REFERENCE FOR SIMPLEDATEFORMAT:
(quoted from Java documentation)
Letter Date or Time Component Presentation Examples
G Era designator Text AD
y Year Year 1996; 96
M Month in year Month July; Jul; 07
w Week in year Number 27
W Week in month Number 2
D Day in year Number 189
d Day in month Number 10
F Day of week in month Number 2
E Day in week Text Tuesday; Tue
a Am/pm marker Text PM
H Hour in day (0-23) Number 0
k Hour in day (1-24) Number 24
K Hour in am/pm (0-11) Number 0
h Hour in am/pm (1-12) Number 12
m Minute in hour Number 30
s Second in minute Number 55
S Millisecond Number 978
z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
Z Time zone RFC 822 time zone -0800
*/
// the order of the list below matters--better not to put the year-only ones at the top,
// because then the guesser succeeds before it has a chance to try parsing days.
static
{
parsers.add(new DateTimeParser("yyyy-MM-ddzzzzzzzzzz", TimeUnit.DAY));
parsers.add(new DateTimeParser("MMM dd yyyy HH:mm", TimeUnit.SECOND));
parsers.add(new DateTimeParser("MMM/dd/yyyy HH:mm", TimeUnit.SECOND));
parsers.add(new DateTimeParser("MM/dd/yy HH:mm", TimeUnit.SECOND));
parsers.add(new DateTimeParser("MMM dd yyyy HH:mm:ss", TimeUnit.SECOND));
parsers.add(new DateTimeParser("MM/dd/yyyy HH:mm:ss", TimeUnit.SECOND));
parsers.add(new DateTimeParser("MMM dd yyyy HH:mm:ss zzzzzzzz", TimeUnit.SECOND));
parsers.add(new DateTimeParser("EEE MMM dd HH:mm:ss zzzzzzzz yyyy", TimeUnit.SECOND));
parsers.add(new DateTimeParser("EEE MMM dd HH:mm:ss zzzzzzzz yyyy", TimeUnit.SECOND));
parsers.add(new DateTimeParser("MM-dd-yyyy", TimeUnit.DAY));
parsers.add(new DateTimeParser("yyyy-MM-dd", TimeUnit.DAY));
parsers.add(new DateTimeParser("yyyyMMdd", TimeUnit.DAY));
parsers.add(new DateTimeParser("MM-dd-yy", TimeUnit.DAY));
parsers.add(new DateTimeParser("dd-MMM-yy", TimeUnit.DAY));
parsers.add(new DateTimeParser("MM-dd-yyyy", TimeUnit.DAY));
parsers.add(new DateTimeParser("MM/dd/yy", TimeUnit.DAY));
parsers.add(new DateTimeParser("MM/dd/yyyy", TimeUnit.DAY));
parsers.add(new DateTimeParser("dd MMM yyyy", TimeUnit.DAY));
parsers.add(new DateTimeParser("dd MMM, yyyy", TimeUnit.DAY));
parsers.add(new DateTimeParser("MMM dd yyyy", TimeUnit.DAY));
parsers.add(new DateTimeParser("MMM dd, yyyy", TimeUnit.DAY));
parsers.add(new DateTimeParser("EEE MMM dd zzzzzzzz yyyy", TimeUnit.DAY));
parsers.add(new DateTimeParser("EEE MMM dd yyyy", TimeUnit.DAY));
parsers.add(new DateTimeParser("MMM-yy", TimeUnit.MONTH));
parsers.add(new DateTimeParser("MMM yy", TimeUnit.MONTH));
parsers.add(new DateTimeParser("MMM/yy", TimeUnit.MONTH));
parsers.add(new DateTimeParser("yyyy", TimeUnit.YEAR));
parsers.add(new DateTimeParser("yyyy GG", TimeUnit.YEAR));
}
public DateTimeParser getLastGoodFormat()
{
return lastGoodFormat;
}
public RoughTime guess(String s)
{
// old code for trying the last good parser.
// we took this out because if the last good one was for a single year,
// but a new one is for years and days,
// all you get is the year.
//if (lastGoodFormat!=null)
//try { return lastGoodFormat.parse(s); }
//catch (ParseException e) {}
if (s==null || s.trim().length()==0)
return null;
for (DateTimeParser d: parsers)
{
try
{
RoughTime date= d.parse(s);
lastGoodFormat=d;
return date;
}
catch (ParseException e) {}
}
throw new IllegalArgumentException("Couldn't guess date: '"+s+"'");
}
public static void main(String[] args)
{
DateTimeGuesser g=new DateTimeGuesser();
System.out.println(g.guess("2009-03-04"));
System.out.println(g.guess("June 10, 2010"));
System.out.println(g.guess("2010"));
System.out.println(g.guess("3/17/10"));
}
}