0

問題SimpleDateFormat、実際のタイムスタンプに17時間を追加しているように見えることです。

これは本当に単純なものでなければなりません。何が間違っているのかわかりません。長いナノ秒をフォーマットされたタイムスタンプに変換するメソッドがあります。17時間を追加しています。これが私のSSCCEです

package playground;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.concurrent.TimeUnit;

/**
*
* @author kentcdodds
*/
public class NanosecondsToString {

  public static void main(String[] args) {
    long nanoseconds = 234236402;
    Timestamp ts = new Timestamp(TimeUnit.MILLISECONDS.convert(nanoseconds, TimeUnit.NANOSECONDS));
    SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss:SSS");
    String formatted = format.format(ts);
    System.out.println(formatted);
  }
}

出力:17:00:00:234

山岳部標準時です

4

3 に答える 3

4

タイムゾーンを に設定する必要がありUTCます。

public static void main(String[] args) throws IOException {
              long nanoseconds = 234236402;
              Timestamp ts = new Timestamp(TimeUnit.MILLISECONDS.convert(nanoseconds, TimeUnit.NANOSECONDS));
              SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss:SSS");
              format.setTimeZone(TimeZone.getTimeZone("UTC"));
              String formatted = format.format(ts);
              System.out.println(formatted);
    }

SimpleDateFormatデフォルトでは、タイムスタンプを現在のタイムゾーンの時間に変換します。そのため、UTC と見なすように指示する必要があります。それ以外の場合は、jodatime の interval クラスを使用できます。

于 2012-06-01T16:01:33.740 に答える
1

あなたのマシンはどのタイムゾーンにありますか?タイムゾーン変換を行っている可能性がありますか?

その場合は、Java TimeZoneクラスを使用すると役立つ場合があります:http://docs.oracle.com/javase/1.4.2/docs/api/java/util/TimeZone.html

于 2012-06-01T15:58:28.763 に答える
0

SimpleDateFormat を使用した書式設定では、暗黙的に期間を日付に変換しています。その日付を半安全にフォーマットするには、DST を使用せずに GMT タイムゾーンでフォーマットを行います。+24 時間の継続時間に遭遇した場合、これにはまだ問題があります。

より良い解決策は、Duration クラスと SimpleDurationFormat クラスをコーディングすることです。面倒ですが、これは一度だけ行う必要があります。デュレーションを明示的にサポートしている JodaTime を吸い込むなど、代替手段も存在します (ただし、フォーマットする必要はありませんでした)。

于 2012-06-01T16:02:54.713 に答える