1

JPA を使用してデータベースから日付を読み取る際に問題があります。私はEclipseLinkとPostgreSQLを使用しています

CSV ファイルからデータベースにデータを入力しました。魔女には日付が文字列として含まれていました (この形式: 6/30/2009-23:59:56)。次のスニペットを使用して、Date オブジェクトに変換しました。

public static Date parseDate(String s){
    DateFormat formatter = new SimpleDateFormat("d/M/yyyy-k:m:s");
    try {
        return new Date( ((java.util.Date)formatter.parse(s)).getTime() );
    } catch (ParseException ex) {
        Logger.getLogger(Type.class.getName()).log(Level.SEVERE, null, ex);
        return null;
    }
}

日付は正しく変換され、期待どおりにデータベースに格納されます。Date オブジェクトをデータベースにマップする方法は次のとおりです。

@Column(name="data_ts", nullable=false)
@Temporal(TemporalType.TIMESTAMP)
private Date dataTs;

データベースから日付を読み取ってチャート(Highcharts)で使用しようとすると、問題が発生するようです。上記と同じタイムスタンプを持つレコードは、次のように読み取られます。

Mon Jun 06 23:59:56 BRT 2011そしてそれはタイムスタンプです1307415596000

ブラジル時間 (+3h) であるため、(GMT から計算された) タイムスタンプは 3 時間ずれていることに注意してください。プロットされると、タイムスタンプは07/06/2011 02:59:56

次に例を示します。

List<TimedataEnt> timeData = currentWellsite.getTimeData();
String debug = timeData.get(timeData.size()-1).getDataTs().toString() + ">>>" + timeData.get(timeData.size()-1).getDataTs().getTime();

currentWellsiteは JPA エンティティであり、getDataTs()java.util.Date オブジェクトを返します。文字列は"Tue Jun 30 23:59:56 BRT 2009>>>1246417196000"

データベースから読み取ったタイムスタンプを変換しないように JPA に指示するにはどうすればよいですか?

4

3 に答える 3

3

前述のように、日付とタイムスタンプにはタイムゾーンが考慮されていません。Java がデータベースから読み取る時刻が現在のデフォルトのタイムゾーンであると見なすため、問題が発生しているようです。

したがって、データベースに含ま2011-04-04 14:00:00れていて、現在のタイムゾーンが +3 の場合、それを Java Date に割り当てる2011-04-04 14:00:00 BRT time(+3)と、タイムスタンプが 3 時間ずれた が生成されます (タイムスタンプは UTC から計算されるため)。

計算されたタイムスタンプを取得して問題を解決しました:

long ts = myDate().getTime() + TimeZone.getDefault().getRawOffset();

getRawOffset()夏時間は考慮されていません。そのために、使用しますgetOffset()

于 2012-06-05T12:51:15.103 に答える
1

あなたの日付は6/30/2009-23:59:56です。私はそれを 2009 年 6 月 30 日 23:59:56 と読みました。したがって、解析する形式はM/d/yyyy-HH:mm:ssorである必要がありM/d/yyyy-kk:mm:ssます (時間数が 1 から 24 か 0 から 23 かによって異なります)。しかし、絶対にそうではありませんd/M/yyyy-k:m:s。月は日の前に来ます。

また、タイムスタンプにはタイムゾーンがありません。それは普遍的な瞬間です。タイムゾーンが重要なのは、その値を表示するときだけです。なぜなら、時間を表示するために使用するタイムゾーンを選択する必要があるからです。適切なタイムゾーンが設定された DateFormat を使用して、タイムスタンプを表示します。

于 2012-06-01T22:43:59.027 に答える
0

あなたの問題は、Timestamp (タイムゾーンを持たない) を java.util.Date (タイムゾーン オフセットを持つ) に保存しているようです。

タイムゾーンの設定方法を制御したい場合は、Timestamp を java.sql.Timestamp として保存するか、独自の @Converter を使用します。

一般に、Calendar は Java で使用する必要があり、ほとんどの場合非推奨の java.util.Date ではありません。カレンダーにもタイムゾーンがあるため、同様の問題が発生する可能性があります。

于 2012-06-04T14:25:23.847 に答える