13

質問を明確にするために全体の話は必要ないので、コードだけを示します (これは単なる例です)。私の結果に違いがあるのはなぜですか?

コード

long millis = 2305293L;
System.out.println(
    millis + "ms = " + 
    (millis / 1000) + "s = " + 
    (millis / 1000 / 60) + "m");
System.out.println(
    new SimpleDateFormat("HH:mm:ss").
    format(
        new Date(millis)
        )
    );

出力

2305293ms = 2305s = 38m
01:38:25
4

3 に答える 3

39

ロンドンまたはパリにいる場合、タイムゾーンは 1970 年 1 月 1 日の GMT+1 でした。

@ARC がコメントで説明している理由により、英国は 1968 年 2 月 18 日から 1971 年 10 月 31 日まで GMT+1 または UTC+1 を使用しました。

干渉するタイムゾーンなしで long を変換することは可能ですか?

TimeZone を GMT に設定します。

long millis = 2305293L;
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(sdf.format(new Date(millis)));

版画

00:38:25.293
于 2013-01-02T15:39:01.510 に答える
2

これを試して :

System.out.println(new java.util.Date (0));

01:00:00 に始まることがわかります。したがって、1 時間の違いがあります。

于 2013-01-02T15:42:23.783 に答える
1

他の回答は正しく、2013 年に質問されたときは適切な回答でした。現在、 DatenorSimpleDateFormatを使用する必要がなくなったため、代わりにいくつかの最新のコード スニペットをお見せしたいと思います。(この場合) 2 305 293 ミリ秒をフォーマットする正しい方法は、それらが表すものによって異なります。3 つの異なる状況に対応する 3 つのオプションを提示します。

エポックからのミリ秒数のフォーマット

ある時点を解釈するタイムゾーンを決定する必要があります。例えば:

    long millis = 2_305_293L;
    DateTimeFormatter formatter = DateTimeFormatter
            .ofLocalizedDateTime(FormatStyle.LONG)
            .withLocale(Locale.ENGLISH);
    ZonedDateTime dateTime = Instant.ofEpochMilli(millis)
            .atZone(ZoneId.of("America/Coral_Harbour"));
    String formattedTime = dateTime.format(formatter);
    System.out.println(formattedTime);

1969 年 12 月 31 日午後 7 時 38 分 25 秒(EST)

エポックでコーラル ハーバーは UTC オフセット -05:00 にあったため、1969 年末近くの時刻が得られます。UTC で時間が必要な場合 (エポックは UTC で定義されているため、つまり、必要な場合00:38:25)、それは少し異なります:

    DateTimeFormatter formatter = DateTimeFormatter
            .ofLocalizedDateTime(FormatStyle.MEDIUM)
            .withLocale(Locale.ENGLISH);
    OffsetDateTime dateTime = Instant.ofEpochMilli(millis)
            .atOffset(ZoneOffset.UTC);

1970 年 1 月 1 日午前 12 時 38 分 25 秒

タイム ゾーンに加えて、ロケールによって言語を変更したり、フォーマット スタイル (フル、ロング、ミディアム、ショート) によってフォーマットの長さを変更したりできます。日付なしで時刻が必要な場合は、ofLocalizedTime代わりに を使用しofLocalizedDateTimeます。

ミリ秒単位の書式設定

ミリ秒が、どのタイムゾーンでも 0:00 (「真夜中」) 以降であると仮定します。

    LocalTime time = LocalTime.MIN.with(ChronoField.MILLI_OF_DAY, millis);
    System.out.println(time);

00:38:25.293

この形式で十分な場合は、明示的なフォーマッターは必要ありません。そうでない場合は、 を使用できますDateTimeFormatter

期間、時間のフォーマット

時間は時間とは全く別のものであり、Durationオブジェクトとして扱われます。それをフォーマットするための直接的なサポートはありませんが、Java 9 以降はそれほど難しくありません (やり方がわかれば):

    Duration amountOfTime = Duration.ofMillis(millis);
    String formattedTime = String.format("%02d:%02d:%02d",amountOfTime.toHours(),
            amountOfTime.toMinutesPart(), amountOfTime.toSecondsPart());
    System.out.println(formattedTime);

00:38:25

リンク

Oracle チュートリアル: Java.time の使用方法を説明する Date Time。

于 2019-06-04T14:05:16.923 に答える