0

タイムゾーンを操作することは私の宿敵だと言わざるを得ません!

私のDB(PostGres)には、タイプ「タイムスタンプなしのタイムスタンプ」ゾーンのフィールドがあります。

保存する値は UTC 時間です。

私がやりたいことは、マシンのデフォルトのタイムゾーンに従って値を表示することです。

したがって、DB から値を取得するときは、まずこれが UTC 時間であることを「言う」必要があるため、タイムゾーンを UTC に設定します。

private Date lastUpdateToUTC( Date myDate)
{
    if ( myDate!= null )
    {
        SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
        dateFormat.setTimeZone( TimeZone.getTimeZone( "UTC" ) );

        System.out.println("orig: " + dateFormat.format(myDate));

        try
        {
            Date convertedDate = dateFormat.parse( dateFormat.format( myDate) );

            dateFormat.setTimeZone( TimeZone.getDefault( ) );

            System.out.println("converted: " + dateFormat.format(convertedDate));

            return dateFormat.parse( dateFormat.format( convertedDate ) );
            ....

myDate が 2013-08-05 10:44:08 だとします。

私が期待しているのは、最初の出力が 2013-08-05 10:44:08 で、2 番目の出力が 2013-08-05 12:44:08 であることです。

代わりに、2013-08-05 08:44:08 と 2013-08-05 10:44:08 を取得します...

推論のどこに誤りがありますか? 期待どおりの結果を得るにはどうすればよいですか?

4

2 に答える 2

1

java.util.Date はタイムゾーンをサポートしていません。

最初の出力では、dateFormat を UTC に設定します。Date to dateFormat を指定すると、UTC に変換されます。Date がどのタイムゾーンであるかを知る方法はなく、ローカル タイムゾーンであると想定します。あなたの場合はGMT + 2のように見えますが、dateFormatは2を引いてUTCにします。次に、何の影響も与えない format - parse を実行してから、タイムゾーンをローカルのタイムゾーンに変更し、元の Date 値を出力します。(今回は変換なし)。

于 2013-08-07T03:00:25.670 に答える
1

現在のローカル タイムゾーンは ですGMT+2。そのため、最初の出力はT+2時間になります。
日付を UTC タイムゾーンで印刷するために、+2時間オフセットのために日付から 2 時間が差し引かれます。

intput: 2013-08-05 10:44:08      // GMT+2 timezone
orig: 2013-08-05 08:44:08        // UTC timezone
converted: 2013-08-05 10:44:08   // default timezone: GMT+2 timezone

を使用して、現在のローカル タイムゾーンを出力してオフセットを知ることができますdateFormat.getTimeZone()
私自身を例にとると、私のローカル タイムゾーンはGMT+8で、オフセットは8 * 60 * 60 * 1000 = 28800000ミリ秒になります。

System.out.println("My Current Timezone: " + dateFormat.getTimeZone());
// My Current Timezone: sun.util.calendar.ZoneInfo[id="Asia/Taipei",offset=28800000,dstSavings=0,useDaylight=false,transitions=42,lastRule=null]
于 2013-08-06T14:52:24.287 に答える