2016-05-04 9 views
1

MyBatis TypeHandlerクラスを使用するJavaアプリケーションがあります。 MySqlデータベースに保存されている日付がMST時間であることを確認する必要があります。UTC JodaTime.DateTimeオブジェクトを別のタイムゾーンのタイムスタンプに変換する

もう1つ MSTにあるデータベースから日付を取得し、それをUTCに変換するTypeHandler。したがって、たとえば、データベースにタイムスタンプがいた場合:

2016-05-05 00:01:00 

日はアプリ側で表示されたとき、それは次の形式(UTC)である:

2016-05-05T07:01:00.000Z 

アプリ側がすべて行います残念ながら、MySqlサーバーはMSTに保存する必要があります。

アプリケーションが実行されているサーバー(MST、PST、ESTで実行されているサーバー)の日付を一致させるために、2つのTypeHandlerが必要です.1つは、アプリケーションに入る日付とマーシャリングするそれがMSTに戻っていることを確認してください。

UtcToMstDateTimeTypeHanlderのsetParameterを使用する方法:

@Override 
public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException 
{ 
    if (parameter != null) 
    { 
     //1. 2016-05-05 00:01:00 (timestamp) converted to UTC DateTime -> 2016-05-05T07:01:00.000Z 
     DateTime thisDateTime = (DateTime) parameter; 
     //2. UTC DateTime converted to LocalDateTime -> 2016-05-05T07:01:00.000 
     LocalDateTime thisLocalDateTime = thisDateTime.toLocalDateTime(); 
     //3. LocalDateTime to MST DateTime -> 2016-05-05T07:01:00.000-07:00 
     DateTime mstTime = thisLocalDateTime.toDateTime(DateTimeZone.forID("MST")); 
     //4. But TimeStamp adds 3 hours... Why? 2016-05-05 10:01:00.0 
     Timestamp mstTimeStamp = new Timestamp((mstTime).getMillis()); 

     ps.setTimestamp(i, mstTimeStamp); 
    } 
    else 
    { 
     ps.setTimestamp(i, null); 
    } 
} 

タイムスタンプが3時間進んUTCのされて終わる:

2016-05-05 10:01:00.0 

それだけでなく、それはまた、MSTよりUTCより相対的なものですただし、現在はUTCより+10:01時間遅れています。

所望の効果がTypeHandlerは以下のタイムスタンプとしてバックデータベースに日付を書き込むことです。

2016-05-05 00:01:00.0 

Iは、単に日付バックデータベース(上記タイムスタンプ)にするために提供したいと思いそれが出て来たものと同じである。

現在、私は米国の東海岸(EST)でこれを実行しています。

答えて

0

ここで私はやらなければならなかったことです。以下では、私が作業していた日付のハードコーディングについて、UTCからMSTタイプハンドラに入ってきたことに注意してください。基本的な考え方は、タイムゾーンからのオフセットを取得することです。 DateTimeZoneをJodaTimeクラスから

のgetOffset(ロングインスタント) は、ローカルタイムを取得するためにUTCに追加するミリ秒単位のオフセットを取得します。今

 DateTime thisDateTime = new DateTime("2016-05-07T07:01:00.000Z"); 

     thisDateTime = thisDateTime.withZone(DateTimeZone.UTC); 

     thisDateTime = thisDateTime.toLocalDateTime().toDateTime(); 

     DateTime mstTime = thisDateTime.withZone(DateTimeZone.forID("MST"));  

     int offset = mstTime.getZone().getOffset(new DateTime().getMillis()); 

     Timestamp mstTimeStamp = new Timestamp(mstTime.getMillis() + offset); // -25200000 == 7 hours 

     ps.setTimestamp(i, mstTimeStamp); //2016-05-07 00:01:00 

、サーバはアプリのコードを実行しているに関係なくは、日付は常にMST時間に実行するデータベース、に正しく入力されています。

関連する問題