3

私は 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")

ただし、結果は本来よりも 1 時間早くなります。

. 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());

これを行う簡単な方法はありますか?

4

1 に答える 1