我是一个试图利用Stata的Java的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());有更简单的方法吗?
发布于 2019-04-25 18:01:04
社区提供的命令filesys是实现您想要的最简单的方法:
. findfile auto.dta
. filesys `r(fn)', attributes
. return list
macros:
(some output omitted)
r(accessednum) : "1871843910000"
r(modifiednum) : "1745362526000"
r(creatednum) : "1745362526000"
r(accessed) : "25apr2019 20:38:30"
r(modified) : "22apr2015 22:55:26"
r(created) : "22apr2015 22:55:26"
. display %tcHH:MM `r(modifiednum)'
22:55您可以使用社区提供的命令filesys来安装github命令。
. net install github, from("https://haghish.github.io/github/")
. github install wbuchanan/StataFileSystemhttps://stackoverflow.com/questions/19573203
复制相似问题