首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最后修改文件的返回时间

问最后修改文件的返回时间
EN

Stack Overflow用户
提问于 2013-10-24 18:00:55
回答 1查看 396关注 0票数 3

我是一个试图利用Stata的Java的Stata用户。我想使用Java将最后修改文件的时间返回给Stata。然而,我想我遇到了时区的问题。

为非Stata用户提供的Stata时间的快速背景:时间由January 1, 1960 00:00:00.000以来的毫秒数表示。Stata没有时区,所以我希望Java函数的返回值是从午夜开始在我的时区(美国/纽约)的January 1, 1960上的毫秒数。

下面是我对Java函数的尝试(如果这样做有帮助的话,我可以完整地发布它):

代码语言:javascript
复制
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,我运行以下命令:

代码语言:javascript
复制
// Calls SFileAttribs.lastModified("Test.txt", "filetime").
javacall SFileAttribs lastModified, args("Test.txt" "filetime")

然而,结果比应该提前一小时:

代码语言:javascript
复制
. display %tc filetime
24oct2013 12:54:36

我的时区上一次修改的时间是13:54,而不是12:54。

我真的在这个问题上苦苦挣扎,如果有任何建议,我将不胜感激。

编辑:

也许不出所料,考虑到我来自一种没有时区的语言,我想我把日光节约搞砸了。在我的时区,现在是DST,但在January 1, 1960的同一时区,它不是DST。我需要说明这一点:

代码语言:javascript
复制
// 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());

有更简单的方法吗?

EN

回答 1

Stack Overflow用户

发布于 2019-04-25 18:01:04

社区提供的命令filesys是实现您想要的最简单的方法:

代码语言:javascript
复制
. 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命令。

代码语言:javascript
复制
. net install github, from("https://haghish.github.io/github/")
. github install wbuchanan/StataFileSystem
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19573203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档