9

次のような生の日付フィールド (文字データとして保存) を含むデータベース フィールドがあります。

2008 年 9 月 26 日金曜日午後 8 時 30 分 (東部夏時間)

SimpleDateFormat を使用して、これを日付として簡単に解析できます

DateFormat dbFormatter = new SimpleDateFormat("EEEE, MMMM dd, yyyy hh:mm aa zzzz");
Date scheduledDate = dbFormatter.parse(rawDate);

私がやりたいのは、この文字列から TimeZone オブジェクトを抽出することです。このアプリケーションが実行される JVM のデフォルトの TimeZone は GMT であるため、上記の解析.getTimezoneOffset()結果からは使用できません (デフォルトの TimeZone が返されるため)。Date

生の文字列をトークン化し、タイムゾーン文字列の開始位置を見つけることに加えて (形式が常に であることを知っているためEEEE, MMMM dd, yyyy hh:mm aa zzzz)、DateFormat/SimpleDateFormat/Date/Calendar API を使用して TimeZone オブジェクトを抽出する方法があります-これは同じ TimeZone を持ちます私が分解した文字列としてDateFormat.parse()

Java API のDatevsについて私を悩ませていることの 1 つは、それがすべての場所で置き換えられることになっていることです... しかし、彼らは決定しました。CalendarCalendarDateDateDateFormat

4

7 に答える 7

2

私は次のことを発見しました:

        DateFormat dbFormatter = new SimpleDateFormat("EEEE, MMMM dd, yyyy hh:mm aa zzzz");
        dbFormatter.setTimeZone(TimeZone.getTimeZone("America/Chicago"));
        Date scheduledDate = dbFormatter.parse("Friday, September 26, 2008 8:30 PM Eastern Daylight Time");
        System.out.println(scheduledDate);
        System.out.println(dbFormatter.format(scheduledDate));
        TimeZone tz = dbFormatter.getTimeZone();
        System.out.println(tz.getDisplayName());
        dbFormatter.setTimeZone(TimeZone.getTimeZone("America/Chicago"));
        System.out.println(dbFormatter.format(scheduledDate));

次を生成します。

Fri Sep 26 20:30:00 CDT 2008
Friday, September 26, 2008 08:30 PM Eastern Standard Time
Eastern Standard Time
Friday, September 26, 2008 08:30 PM Central Daylight Time

私は実際にこれがいくぶん驚くべきことに気づきました。しかし、それはあなたの質問に対する答えが、解析した後にフォーマッターでgetTimeZoneを呼び出すことであることを示していると思います。

編集:上記はSunのJDK1.6で実行されました。

于 2008-09-17T18:32:42.240 に答える
1

@エドトーマス:

私はあなたの例に非常に似たものを試しましたが、非常に異なる結果が得られました:

String testString = "Friday, September 26, 2008 8:30 PM Pacific Standard Time";
DateFormat df = new SimpleDateFormat("EEEE, MMMM dd, yyyy hh:mm aa zzzz");

System.out.println("The default TimeZone is: " + TimeZone.getDefault().getDisplayName());

System.out.println("DateFormat timezone before parse: " + df.getTimeZone().getDisplayName());

Date date = df.parse(testString);

System.out.println("Parsed [" + testString + "] to Date: " + date);

System.out.println("DateFormat timezone after parse: " + df.getTimeZone().getDisplayName());

出力:

デフォルトのタイムゾーンは次のとおりです: 東部標準時

解析前の DateFormat タイムゾーン: 東部標準時

[2008 年 9 月 26 日金曜日午後 8 時 30 分 (太平洋標準時)] から現在まで: 9 月 27 日土曜日 00:30:00 EDT 2008

解析後の DateFormat タイムゾーン: 東部標準時

を呼び出す前に明示的にスローしても、 ...DateFormat.getTimeZone()の前後で同じ TimeZone を返すようです。parse()setTimeZone()parse()

DateFormat と SimpleDateFormat のソースを見るとgetTimeZone()、基礎となる Calendar の TimeZone を返すだけのようです...使用する特定のものを指定しない限り、デフォルトの Locale/TimeZone の Calendar になります。

于 2008-09-17T18:47:38.727 に答える
1

Joda Time の日付と時刻 API を確認することをお勧めします。Java の組み込みの日付と時刻のサポートよりもはるかに優れている傾向があるため、私は最近、それを信じるようになりました。特に、DateTimeZoneクラスを確認する必要があります。お役に立てれば。

http://joda-time.sourceforge.net/

http://joda-time.sourceforge.net/api-release/index.html

于 2008-09-17T19:09:38.970 に答える
0

エドはそれを正しく持っています。時刻が解析された後、DateFormatオブジェクトにtimeZoneが必要です。

 String rawDate = "Friday, September 26, 2008 8:30 PM Eastern Daylight Time";
 DateFormat dbFormatter = new SimpleDateFormat("EEEE, MMMM dd, yyyy hh:mm aa zzzz");
 Date scheduledDate = dbFormatter.parse(rawDate);

 System.out.println(rawDate); 
 System.out.println(scheduledDate); 
 System.out.println(dbFormatter.getTimeZone().getDisplayName());

を生成します

Friday, September 26, 2008 8:30 PM Eastern Daylight Time
Fri Sep 26 20:30:00 CDT 2008
Eastern Standard Time
于 2008-09-17T18:58:55.610 に答える
0

部分的な解決策として、正規表現の一致を使用してタイムゾーンを取得できます。これは、その前に常に同じテキストがあるためです。午前または午後。

Java のタイムゾーンについては、最後の部分を理解するのに十分な知識がありません。

于 2008-09-17T17:55:59.507 に答える
0

Date と Calendar の主な違いは、Date は単なる値オブジェクトであり、変更するメソッドがないことです。そのため、日付/時刻情報をどこかに保存するように設計されています。Calendar オブジェクトを使用する場合は、日付/時刻情報を使用して何らかのビジネス ロジックを実行する永続エンティティに設定した後で変更できます。エンティティはこの変化を認識する方法がないため、これは非常に危険です。Calendar クラスは、日付の追加など、日付/時刻に関する操作用に設計されています。

あなたの例をいじってみると、次のようになります。

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

public class TimeZoneExtracter {

    public static final void main(String[] args) throws ParseException {
        DateFormat dbFormatter = new SimpleDateFormat("EEEE, MMMM dd, yyyy hh:mm aa zzzz");
        System.out.println(dbFormatter.getTimeZone());
        dbFormatter.parse("Fr, September 26, 2008 8:30 PM Eastern Daylight Time");
        System.out.println(dbFormatter.getTimeZone());
    }

}

出力:

sun.util.calendar.ZoneInfo[id="ヨーロッパ/ベルリン"... sun.util.calendar.ZoneInfo[id="アフリカ/アディスアベバ"...

これはあなたが望んでいた結果ですか?

于 2008-09-17T18:38:38.140 に答える