1

このコード:

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-DD_HH-mm-ss");
Date date=null;
try {
  date = format.parse("2012-07-04_13-42-03");
} catch (Exception e) {
}
File file = new File("File.txt");
Date now=new Date();
Date last= new Date(file.lastModified());
System.out.println("exec:"+date+" "+date.getTime()+" "+date.getTimezoneOffset());
System.out.println(" now:"+now+" "+now.getTime()+" "+now.getTimezoneOffset());
System.out.println("last:"+last+" "+last.getTime()+" "+last.getTimezoneOffset());

結果が得られます:

exec:Wed Jan 04 13:42:03 CET 2012 1325680923000 -60
 now:Wed Jul 04 13:42:20 CEST 2012 1341402140349 -120
last:Mon Jul 02 17:26:37 CEST 2012 1341242797000 -120

文字列から日付を作成して、同じタイムゾーンで他の文字列と比較できるようにするにはどうすればよいですか?

4

3 に答える 3

2

Dateタイムゾーンありません。混乱しているのは、Date.toString() 常にシステムのデフォルトのタイムゾーンでフォーマットされた値を返すことです。これDate.getTimeZoneOffsetも同様です。

これで、システムのデフォルトのタイムゾーン(中央ヨーロッパ時間、見た目では)で、タイムゾーンの省略形と同様に、UTCからのオフセットが1年を通して変化します。それがあなたが見ているものです:「中央ヨーロッパ」時間(UTC + 1)と「中央ヨーロッパ夏時間」)(UTC + 2)の違い。Dateこれは、文字列表現に変換する値によって表される瞬間の現在のシステムタイムゾーンのタイムゾーン情報です。

繰り返しますが、Dateそれ自体にはタイムゾーンに関する情報がありません。それはただの時点です。SimpleDateFormat解析またはフォーマット時に使用するタイムゾーンを設定できます。これは別の問題です。

可能であれば、JodaTimeの使用も検討する必要があります。Javaに組み込まれているAPIよりもはるかに優れています。

于 2012-07-04T11:58:39.030 に答える
1

さて、問題はタイムゾーンではなく、

2012-07-04_13-42-03

Wed Jan 04 13:42:03 CET 2012

問題はフォーマットパターンにあるので、変更します

yyyy-MM-DD_HH-mm-ss

yyyy-MM-dd_HH-mm-ss

Dは年の日を意味し、dは月の日を意味するため

于 2012-07-04T12:18:56.570 に答える
1

java.time

java.utilDate-Time APIとそのフォーマットAPIはSimpleDateFormat古く、エラーが発生しやすいです。それらの使用を完全に停止し、最新の日時API *に切り替えることをお勧めします。

また、以下に引用されているのは、Joda-Timeのホームページからの通知です。

Java SE 8以降では、ユーザーはjava.time(JSR-310)に移行するように求められることに注意してください。これは、このプロジェクトに代わるJDKのコア部分です。

java.time最新の日時APIを使用したソリューション:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        String strDateTime = "2012-07-04_13-42-03";
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("u-M-d_H-m-s", Locale.ENGLISH);
        LocalDateTime ldt = LocalDateTime.parse(strDateTime, dtf);
        System.out.println(ldt);
    }
}

出力:

2012-07-04T13:42:03

ONLINE DEMO

2つのを比較する方法LocalDateTime

とを使用LocalDateTime#isAfterLocalDateTime#isBeforeて2つのを比較できますLocalDateTime

Trail: DateTimeから最新のDate-TimeAPIの詳細をご覧ください。

コードの何が問題になりましたか?

年の日D指定するを使用しましたが、月の日dを指定する必要があります。同じタイムゾーンのすべての日時を比較しているため、この場合のタイムゾーンに問題はありません。


*何らかの理由で、Java6またはJava7に固執する必要がある場合は、 Java.time機能のほとんどをJava6および7にバックポートするThreeTen-Backportを使用できます。AndroidプロジェクトおよびAndroidAPIで作業している場合レベルはまだJava-8に準拠していません。脱糖によって利用可能なJava8+APIAndroidプロジェクトでのThreeTenABPの使用方法を確認してください。

于 2021-07-20T18:59:22.770 に答える