地図データベースのタイムスタンプラUTCカレンダー(JPA)でUTCとして日経由WebService(jax-ws)

StackOverflow https://stackoverflow.com/questions/1821104

  •  10-07-2019
  •  | 
  •  

質問

この音のように簡単に行えます。
車UTC timestamp値からのDBでUTCとして日Webサービスです。

してtimestampカラムDATE_COLUMNや店舗が時間をUTCタイムゾーンになります。

とJPAたこと

@Column(name = "DATE_COLUMN")
private java.sql.Timestamp dateValue;

そして、人びとがいいことWebサービスをUTC(Jax-ws2.0いgetDateとsetDateます。
いgetDate.

public Calendar getDate()
{
   Calendar calendar = Calendar.getInstance(utcTimeZone);
   calendar.setTimeInMillis(dateValue.getTime());

   return calendar;
}

この動作しないとしています。
この応用のデフォルトのタイムゾーンをしない'UTC'.

ここでは明確にして頂きたい。
値のDATE_COLUMN="30.11.09 16:34:48,833045000しているので世界標準時間を取得しま"2009-11-30T14:34:48.833Z"
その違いは2時間です。これは私のデフォルトのタイムゾーンを"ヨーロッパ/ヘルシンキ".

同じ問題また地図"DATE_COLUMNへ Calendar

@Column(name = "DATE_COLUMN")
@Temporal(TemporalType.TIMESTAMP)
private Calendar dateValue;

public Calendar getDate()
{
   calendar.setTimeZone(utcTimeZone);
   return calendar;
}

ならないようにしたい変更申請のタイムゾーンでついにソリューションとなります。

今まで二つの選択しかない。

.オフセット計算と応用の時間帯に、UTCに追加してください後に手動で自動減の暦によるものとする。setTimeZone.

public Calendar getDate()
{
   Calendar calendar = Calendar.getInstance(utcTimeZone);
   calendar.setTimeInMillis(dateValue.getTime());

   int offset = TimeZone.getDefault().getOffset(dateValue.getTime());

   calendar.add(Calendar.MILLISECOND, offset);

   return calendar;
}

.パスdateValueとして Long Webサービスです。は悪くないことを除いてを失わせてしまうリアルタイプの分野にwsdl.

私の想像液

@Column(name = "DATE_COLUMN")
@Temporal(type = TemporalType.TIMESTAMP, timezone = 'UTC')
private Calendar dateValue;

もっと考える傾向があるようでもありますので、実際どこかということです。については、まず関する情報を取得することができます。

役に立ちましたか?

解決

使用することとしました以下の解決策です。
使用 Date のために取得日からのデータベースです。るからで Date はtimezonelessタイプです。

@Column(name = "DATE_COLUMN")
@Temporal(TemporalType.TIMESTAMP)
private Date dateValue;

public Date getDate()
{
   return dateValue;
}

とを介して送るのがWebServiceにUTC(jax-ws)を作成し UtcTimestampAdapter 変更のゾーンからのデフォルトの世界標準時間の総力を結集します。

public class UtcTimestampAdapter extends XmlAdapter<XMLGregorianCalendar, Date>
{
   @Override
   public XMLGregorianCalendar marshal(Date date) throws Exception
   {
      GregorianCalendar calendar = new GregorianCalendar();
      calendar.setTime(date);

      DatatypeFactory dataTypeFactory = DatatypeFactory.newInstance();
      XMLGregorianCalendar xmlCalendar = 
         dataTypeFactory.newXMLGregorianCalendar(calendar);

      //Reset time zone to UTC
      xmlCalendar.setTimezone(0);

      return xmlCalendar;
   }

   @Override
   public Date unmarshal(XMLGregorianCalendar calendar) throws Exception
   {
      return calendar.toGregorianCalendar().getTime();
   }
}

そしてこのルールをすべて Datas分野のモジュールを追加し、パッケージの特定の設定のようです。

@XmlJavaTypeAdapter(value = UtcTimestampAdapter.class, type = Date.class)
@XmlSchemaType(name = "dateTime", type = XMLGregorianCalendar.class)
package com.companyname.modulename;

それだけです。現在の汎用ソリューションを内包すべての論理となります。やしていくために、どのような送信timezoneless日UTCとしてwebサービスその他のモジュールまで注釈を付けるパッケージです。

他のヒント

が必要な場合は、javaプロセスでの走行は、世界標準時間のタイムゾーンの最も簡単な方法では追加により、以下のJVMパラメータ:

-Duser.timezone=UTC

TimeZone.setDefault(TimeZone.getTimeZone("UTC")); うに影響を及ぼ全JVM.

この原因となりまその他の用途に失敗すれば、期待した現地時間

少し値段が高くなりますが、設定のデフォルトのタイムゾーンの申込み @StartupBean:

import java.util.TimeZone;
import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
import javax.ejb.Startup;

@Startup
@Singleton
public class StartupBean {

    @PostConstruct
    public void initializeTheServer() {
        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    }
}

それから、すべての解釈のDateオブジェクトに基づきUTCです。このXML整列化.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top