15

タイムスタンプ型の列に値があります。2007-05-04 08:48:40.969774という値があるとします。

さて、データベースから値をフェッチしてこのタイムスタンプ値を関数に返そうとするとき、秒の横の小数部分も返されるようにするには、どの SimpleDateFormatter パターンを使用する必要がありますか。

私はyyyy-MM-dd hh:mm:ssを使用しましたが、それは秒までしか返されず、秒の横にある分数 (.969774) は無視されます。この小数部分も 6 桁の精度で返すのに助けが必要です。

4

4 に答える 4

8

java.util.Datea (または)をフォーマットするデフォルトの方法には、java.sql.Timestampミリ秒の精度しかありません。yyyy-MM-dd hh:mm:ss.SSSそのミリ秒の精度を取得するために使用できます。

Ajava.sql.Timestampは実際には (最大で) ナノ秒の精度を持っています (データベース サーバーとドライバーが実際にサポートしていると仮定します)。Java 8 でフォーマットする最も簡単な方法は、タイムスタンプをjava.time.LocalDateTime( を使用してTimestamp.toLocalDateTime())に変換し、最大ナノ秒をサポートするjava.timeフォーマット オプションを使用することです。java.time.format.DateTimeFormatter

Java 7 以前を使用している場合、通常の日付フォーマッタではサポートされていないため、追加の作業が必要になります。たとえば、dateformatter をパターン付きで使用しyyyy-MM-dd hh:mm:ss(最大秒数までフォーマットするため)、自分自身の 1 秒未満のナノ秒を (適切なゼロ パディングで) 追加することができTimestamp.getNanos()ます。

于 2012-04-09T13:24:41.347 に答える
5

マイクロ秒のタイムスタンプを取得する方法が必要です。System.currentTimeMillis() と System.nanoTime() を組み合わせて使用​​します。次に、それを表示する方法が必要です。1000 で割り、通常どおりミリ秒を表示し、時刻の下 3 桁を表示できます。ie のような時間を過ごす

long timeUS = System.currentTimeMillis() * 1000 + micros;

これはより詳細な例です

HiresTimer.javaおよびHiresTimerTest.java

テストプリント

2012/04/09T14:22:13.656008
2012/04/09T14:22:13.656840
2012/04/09T14:22:13.656958
2012/04/09T14:22:13.657066
 ....
2012/04/09T14:22:13.665249
2012/04/09T14:22:13.665392
2012/04/09T14:22:13.665473
2012/04/09T14:22:13.665581

編集:関連するコードは

private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy/MM/dd'T'HH:mm:ss.SSS");
private static final DecimalFormat DF = new DecimalFormat("000");

public static String toString(long timeUS) {
    return SDF.format(timeUS / 1000) + DF.format(timeUS % 1000);
}
于 2012-04-09T14:04:52.463 に答える
2

Java でマイクロ秒またはナノ秒を処理することは、必ずしも簡単ではありません。


import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;


public class Main {

  public static void main(String args[]) throws Exception {
    long time = System.currentTimeMillis();
    Date d = new Date(time);
    Timestamp t = new Timestamp(time);
    /* micro-seconds as OP requested */
    {
      t.setNanos(123456000);
      System.out.println(d);
      System.out.println(t);
      DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss'.'");
      NumberFormat nf = new DecimalFormat("000000");
      System.out.println(df.format(t.getTime()) + nf.format(t.getNanos() / 1000));
      /* using Java Time API (available since JDK 1.8) */
      DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS");
      LocalDateTime ldt = t.toLocalDateTime();
      System.out.println(ldt.format(dtf));
    }
    /* nanoseconds just for the sake of completness */
    {
      t.setNanos(123456789);
      System.out.println(t);
      DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss'.'");
      NumberFormat nf = new DecimalFormat("000000000");
      System.out.println(df.format(t.getTime()) + nf.format(t.getNanos()));
      /* using Java Time API (available since JDK 1.8) */
      DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.nnnnnnnnn");
      LocalDateTime ldt = t.toLocalDateTime();
      System.out.println(ldt.format(dtf));
    }
  }
}

生成される出力は次のとおりです (私の国、私のロケールで):

火曜日 8 月 31 日 13:26:08 CEST 2021
2021-08-31 13:26:08.123456
2021-08-31 13:26:08.123456
2021-08-31 13:26:08.123456
2021-08-31 13:26:08.123456789
2021-08-31 13:26:08.123456789
2021-08-31 13:26:08.123456789
于 2012-04-09T14:31:42.007 に答える