4

SQL データベースで時間型を照会するために java.sql.Time オブジェクトを作成しようとしていますが、受け取った文字列を解析するために joda を使用しています。

私はいくつかの異なるアプローチを試みました。これは私の最新のものです。

protected Time startTime = null;
protected static final String dateFormat = "HH:mm:ssZ";
protected static final DateTimeFormatter formatter = DateTimeFormat.forPattern(dateFormat);
public TimeBetweenFilter(String fieldName, String type, String value) {
    super(fieldName, type, value);
    String [] times = value.split("\\|");
    if(times.length == 2 && !times[0].isEmpty() && !times[1].isEmpty()){
        try{
            LocalDateTime current = LocalDateTime.now();
            LocalDateTime timeFromEpoch= new LocalDateTime(formatter.parseDateTime(times[0]));
            startTime = new Time(timeFromEpoch.withDate(current.getYear(), current.getMonthOfYear(), current.getDayOfMonth()).toLocalTime().toDateTimeToday().getMillis());
        }catch (Exception e){
           ...
        }

ただし、出力は受信した入力より常に 1 時間遅れます。たとえば、入力が UTC で 10:30:00 の場合、startTime は現地時間の 4:30:00 にする必要があります。しかし、代わりに 3:30 を取得します。

解決済み

DateTime beginning = new DateTime(DateTimeZone.UTC).toDateMidnight().toDateTime().plus(DateTime.parse(times[0], formatter).getMillis());
startTime = new Time(beginning.getMillis());

今朝の午前 0 時にタイム ゾーン UTC で新しい日付を作成し、UTC 時刻をミリ秒単位で追加します。次に、java.sql.Time オブジェクトに変換されます。

4

1 に答える 1

3

ALocalDateTimeには、論理的にタイム ゾーンまたは DST 情報がありませ。それが要点です-それは「ローカル」ですが、特定のタイムゾーンではありません。異なるタイム ゾーンにいる 2 人の人が同じ現地の日付/時刻に起床する場合がありますが、それは同じ瞬間であるという意味ではありません。

タイムゾーンを含むタイプが必要な場合は、 を使用する必要がありますDateTime

編集:わかりました、1つのアプローチは、「ローカルタイムゾーンで今日」を取得し、時間を解析して aLocalTimeにし、2つを組み合わせて a を形成し、それを UTCLocalDateTimeの a に変換してから、代わりにローカルタイムゾーンに変換します。問題は、終了日が同じでない可能性があることです。その場合、1 日を加算または減算する必要がある場合があります。これにより、DST の変更により時刻が変更される可能性があり、さらに困難になります。考慮すべき厄介なコーナーケースが存在する可能性があります。DateTimeDateTime

ただし、最初は要件が奇妙に思えます-ローカルタイムゾーンの日付/時刻で使用したい UTCの時刻だけを持つのは奇妙です。おそらく、もう少しコンテキストを提供していただければ、それが役立つでしょう。

于 2013-09-04T17:00:39.300 に答える