我需要编写高性能函数,根据给定的datetime和timeshift计算新的datetime。它接受2个论点:
函数以第一个参数的格式返回字符串,该第一个参数是将timeshift应用于第一个参数的结果
事先已知,第一个参数在程序生命周期内始终是相同的。
我的实施有以下步骤:
问题是我没有利用第一个参数始终相同的事实。 如果我将创建一个类成员GregorianCalendar(年,月,日,小时,分钟),那么在第一次调用我的函数之后,这个对象将被修改,这是不好的,因为我不能将它重用于以下调用。
答案 0 :(得分:2)
如果可以,请使用Joda-Time库,这使得日期算法变得非常简单:
DateTime dt = new DateTime();
DateTime twoHoursLater = dt.plusHours(2);
他们有一个DateTimeFormatter
类,您可以使用它来将输入日期时间字符串解析为DateTime
,例如:
DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyyMMddHHmm");
DateTime dt = fmt.parseDateTime(myDateString);
DateTime result = dt.plusHours(myTimeshiftInHours);
Joda-Time也与java.util.Date很好地互操作。我喜欢它!
答案 1 :(得分:0)
这个怎么样,
答案 2 :(得分:0)
如果第一个参数是一个不会经常更改的值,可能使用缓存:
static private Map<String,Calendar> dateCache = new HashMap<String,Calendar>();
然后,在你的方法中,检查第一个参数(例如:String dateStr
)是缓存中的一个键
Calendar cal;
if (dateCache.containsKey(dateStr)) {
cal = (Calendar)(dateCache.get(dateStr)).clone();
} else {
// parse date
cal = new GregorianCalendar(...);
dateCache.put(dateStr, (Calendar)cal.clone());
}
并添加你的时移价值。
答案 3 :(得分:0)
我会尝试简单的记忆:
// This is not thread safe. Either give each thread has its own
// (thread confined) converter object, or make the class threadsafe.
public class MyDateConverter {
private String lastDate;
private int lastShift;
private String lastResult;
public String shiftDate(String date, int shift) {
if (shift == lastShift && date.equals(lastDate)) {
return lastResult;
}
// Your existing code here
lastDate = date;
lastShift = shift
lastResult = result;
return result;
}
}
请注意,如果shift
和date
值很少发生变化,这种简单方法最有效。如果频繁更改,则需要更复杂的缓存,代码将更复杂,并且开销(对于缓存未命中)将更高。
答案 4 :(得分:0)
如果您只是想避免一次又一次地重复步骤1(可能是2),请解析日期一次,然后保存您获得的日期。然后,您可以在每个add
步骤之前将此日期应用于日历(使用setDate())(或创建新的GregorianCalendar,测量是否重要)。