2013-08-26 25 views
7

ファイル/ディレクトリを最終的に変更した時刻を特定する必要があるプログラムを作成しています。私はJoda Timeを使ってこの時間を処理したいと思います。そして、Java 7 NIO.2クラスFilesを使ってファイルを最終変更時刻にしています。そのgetLastModifiedTime()方法は、結果、私はジョダ時間DateTimeクラスのコンストラクタに渡す便利な方法toMillis()を、持っているFileTimeクラスのインスタンスを返します。Java 7 NIO.2 Files.getLastModifiedTimeタイムゾーン

new DateTime(Files.getLastModifiedTime(path).toMillis()); 

しかし、私は私がDateTime(long)以来、この間違ったをやっている感じを持っていますコンストラクタは、デフォルトのタイムゾーンでDateTimeインスタンスが作成されることを明示しています。ただし、どこにでもタイムゾーンは記載されていません。私はFileTimeコードを見ました。非常に単純なようで、そのtoString()メソッドは、UTCタイムゾーン(UTCタイムゾーンでCalendarを作成し、そのミリ秒を直接設定する)を使用していることを示唆しています。

したがって、FileTimeはUTCまたは現地時間を使用しますか? FileTimeDateTimeに変換する正しい方法は何ですか?

答えて

5

Javaのミリ秒のタイムスタンプは、UTCのタイムスタンプです。 FileTime.toMillis()が返すものと、DateTimeのコンストラクタが期待するものです。他のJava APIメソッドにも同じことが言えます。例えばSystem.currentTimeMillis()メソッド、java.util.Dateコンストラクタなどがあります。

これらはすべて同じように動作します。実際、他のプログラミング言語のUnix/Linux/OSXライブラリメソッドもそうです。

この壊れた唯一のケースは、誰かがシステムクロックを誤って設定または設定した場合です。

+0

ありがとう、今私は理解しています。何らかの理由で、私は 'DateTime'コンストラクタがローカルタイムゾーンでタイムスタンプを期待していると思っていましたが、あなたが言ったように、タイムスタンプは常にUTCです。次に、別の 'DateTime'コンストラクタの' DateTimeZone'引数は、このタイムスタンプの表示方法を定義します。 –

1

FileTime.toMillis()APIは、エポック(1970-01-01T00:00:00Z)以降のミリ秒単位の値を返します。 new DateTime(millis)は、1970-01-01T00:00:00ZのJavaエポックからミリ秒単位で時間を保持するDateTimeインスタンスを作成し、ミリ秒値が日付時刻フィールドに変換される方法を決定するデフォルトのタイムゾーンで年表を作成します。

関連する問題