我是一个尝试使用 Stata 的Java API的 Stata 用户。我想使用 Java 将文件的最后修改时间返回给 Stata。但是,我认为我遇到了时区问题。
非 Stata 用户在 Stata 中的时间快速背景:时间由自January 1, 1960 00:00:00.000
. Stata 没有时区,因此我希望 Java 函数的返回值是January 1, 1960
我的时区(美国/纽约)自午夜以来的毫秒数。
这是我对 Java 函数的尝试(如果有帮助,我可以将其全部发布):
import com.stata.sfi.*;
// Other imports
public class SFileAttribs
{
// Syntax: lastModified(String filename, String scalar_name)
// Stores in the Stata scalar scalar_name the time of last
// modification of filename.
public static int lastModified(String[] args)
{
// Code here...
// Get the time.
FileTime time;
try {
time = (FileTime) Files.getAttribute(path, "lastModifiedTime");
}
catch (IOException e) {
SFIToolkit.errorln("file I/O error on read");
return(692);
/*NOTREACHED*/
}
// Store the time in the scalar.
Calendar cal1960 = Calendar.getInstance();
cal1960.set(1960, 0, 1, 0, 0, 0);
cal1960.set(Calendar.MILLISECOND, 0);
Scalar.setValue(args[1], time.toMillis() - cal1960.getTimeInMillis());
return(0);
}
}
回到 Stata,我运行这个命令:
// Calls SFileAttribs.lastModified("Test.txt", "filetime").
javacall SFileAttribs lastModified, args("Test.txt" "filetime")
但是,结果比应有的时间早了一个小时:
. display %tc filetime
24oct2013 12:54:36
我的时区最后一次修改的时间是13:54
,不是12:54
。
我真的在这方面苦苦挣扎,如果有任何建议,我将不胜感激。
编辑:
考虑到我来自没有时区的语言,也许可以预见,我想我搞砸了夏令时。在我的时区,现在是 DST,但在同一时区January 1, 1960
,它不是 DST。我需要说明这一点:
// Store the time in the scalar.
Calendar now = Calendar.getInstance();
Calendar cal1960 = Calendar.getInstance();
cal1960.set(1960, 0, 1, 0, 0, 0);
cal1960.set(Calendar.MILLISECOND, 0);
int dstHour = (cal1960.getTimeZone().inDaylightTime(cal1960.getTime()) ? 1 : 0) -
(now.getTimeZone().inDaylightTime(now.getTime()) ? 1 : 0);
cal1960.set(Calendar.HOUR, dstHour);
Scalar.setValue(args[1], time.toMillis() - cal1960.getTimeInMillis());
有没有更简单的方法来做到这一点?