我正在使用Apache POI来评估工作簿的每个公式单元格。 当一个单元格包含对标准excel函数NOW()的调用时,Poi正确评估它并用当前时间替换该调用 - 格式化为VM的默认时区。我想调整这个时区。有没有办法改变DateUtil的时区?
我在3.14-beta1中找到了NOW Implementation的代码,我附上它以供参考:
/**
* Implementation of Excel NOW() Function
*
* @author Frank Taffelt
*/
public final class Now extends Fixed0ArgFunction {
public ValueEval evaluate(int srcRowIndex, int srcColumnIndex) {
Date now = new Date(System.currentTimeMillis());
return new NumberEval(DateUtil.getExcelDate(now));
}
}
答案 0 :(得分:7)
为了完整起见,我将解决方案添加为答案......(即我仍然认为我很年轻,需要投票......)
从POI 3.13开始,我们添加了一个org.apache.poi.util.LocaleUtil
类,以处理POI中的Locale特定请求。有setUserTimeZone()
方法来处理您的问题。这需要根据线程设置 - 因此在打开或创建工作簿之前,请使用TimeZone
对象调用该函数。
通常,clear ThreadLocals in the end of processing是个好主意,特别是如果你处理线程池,所以请在resetUserTimeZone()
块中调用finally
。
虽然我们已经注意防止通过Forbidden Apis Tool对TimeZone / Locale相关调用进行未被注意/默认处理 - 但我不打赌,我们已经涵盖了所有情况。如果您发现任何违规行为,请打开ticket。