package edu.stanford.nlp.sempre;
import fig.basic.LispTree;
import java.util.Calendar;
public class DateValue extends Value {
public final int year;
public final int month;
public final int day;
// Format: YYYY-MM-DD (from Freebase).
// Return null if it's not a valid date string.
public static DateValue parseDateValue(String dateStr) {
if (dateStr.equals("PRESENT_REF")) return null;
if (dateStr.startsWith("OFFSET")) return null;
// We don't handle the following things:
// - "30 A.D" since its value is "+0030"
// - "Dec 20, 2009 10:04am" since its value is "2009-12-20T10:04"
int year = -1, month = -1, day = -1;
boolean isBC = dateStr.startsWith("-");
if (isBC) dateStr = dateStr.substring(1);
// Ignore time
int t = dateStr.indexOf('T');
if (t != -1) dateStr = dateStr.substring(0, t);
String[] dateParts;
if (dateStr.indexOf('T') != -1)
dateStr = dateStr.substring(0, dateStr.indexOf('T'));
dateParts = dateStr.split("-");
if (dateParts.length > 3)
throw new RuntimeException("Date has more than 3 parts: " + dateStr);
if (dateParts.length >= 1) year = parseIntRobust(dateParts[0]) * (isBC ? -1 : 1);
if (dateParts.length >= 2) month = parseIntRobust(dateParts[1]);
if (dateParts.length >= 3) day = parseIntRobust(dateParts[2]);
return new DateValue(year, month, day);
}
private static int parseIntRobust(String i) {
int val;
try {
val = Integer.parseInt(i);
} catch (NumberFormatException ex) {
val = -1;
}
return val;
}
public static DateValue now() {
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
return new DateValue(year, month, day);
}
public DateValue(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public DateValue(LispTree tree) {
this.year = Integer.valueOf(tree.child(1).value);
this.month = Integer.valueOf(tree.child(2).value);
this.day = Integer.valueOf(tree.child(3).value);
}
public LispTree toLispTree() {
LispTree tree = LispTree.proto.newList();
tree.addChild("date");
tree.addChild(String.valueOf(year));
tree.addChild(String.valueOf(month));
tree.addChild(String.valueOf(day));
return tree;
}
@Override public String sortString() { return "" + year + "/" + month + "/" + day; }
public String isoString() {
return "" + (year == -1 ? "xxxx" : String.format("%04d", year))
+ "-" + (month == -1 ? "xx" : String.format("%02d", month))
+ "-" + (day == -1 ? "xx" : String.format("%02d", day));
}
@Override public int hashCode() {
int hash = 0x7ed55d16;
hash = hash * 0xd3a2646c + year;
hash = hash * 0xd3a2646c + month;
hash = hash * 0xd3a2646c + day;
return hash;
}
@Override public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DateValue that = (DateValue) o;
if (this.year != that.year) return false;
if (this.month != that.month) return false;
if (this.day != that.day) return false;
return true;
}
}