2017-04-10 6 views
0

私は、(他のフィールドの中で)文字列として日付をとり、それをmySqlデータベースに保存する単純なサービスを持っています。私はHibernateでSpring Bootを使用しています。 {"expenseDate":"04/02/2017"}というJSONを投稿した場合、ジャクソンマッピング後にキャプチャされる日付は「2017-04-01 19:00:00」です。春休みの不要なタイムゾーン調整

ちなみに、データベースの行を見ると、期待通りの日付は「2017-04-02」です。私がサービスに問い合わせると、jsonに戻ってくる日付は正しいですが、データベースから行をダンプすると、正しい日から6時間を返します。

私はセントラルタイムゾーンに住んでいるので、データベースの日付はUTCで、春は中央時間であるために6時間かかると思います。

コントローラー:

@PostMapping("/expenses") 
public ResponseEntity<Expense> submitExpense(@RequestBody Expense expense) throws BadHttpRequest { 
    expenseService.saveExpense(expense); 
    return new ResponseEntity<>(expense, HttpStatus.CREATED); 
} 

エンティティ:

@Entity 
public class Expense { 
@Id 
@GeneratedValue 
Integer id; 
Double cost; 
String location; 
String expenseType; 
String description; 

@JsonFormat(pattern = "MM/dd/yyyy") 
Date expenseDate; 

私は、日付フィールドに@JsonFormat(pattern = "MM/dd/yyyy", timezone = "UTC")を試してみましたが、それは何も変わっていません。

また、日付部分を使用してビューから日付を作成して、サービスの長さとして渡しましたが、結果は同じです。明らかに私は非常に重大で、おそらく単純なものを見逃しています。

どのような考えですか?

+0

JSON入力で04/02/2017を渡すと、どのタイムゾーンがその日付になるはずですか?あなたのサービスの消費者は、UTCで日付を渡すことになっていますか? –

+0

おそらく私の部分で少しナイーブですが、私はちょうど変更なしでその日付の値を仮定していたので、渡されたものの値を持つ切り捨てられた日付です。そして、だから、私がやっていることは正しいのですが、何も追加することを除けば、オブジェクトを傍受するときに実際の値はオフになります – nbpeth

答えて

1

あなたは、着信日付がであることを期待どんな時間帯に "タイムゾーン" を設定する必要があります。

public class Data { 

    @JsonFormat(pattern = "MM/dd/yyyy", timezone="GMT-04:00") 
    Date date; 

    public Date getDate() { 
     return date; 
    } 

    public void setDate(Date date) { 
     this.date = date; 
    } 
} 

public class Main { 

    public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException { 

     ObjectMapper mapper = new ObjectMapper(); 
     Data data = mapper.readValue("{\"date\" : \"04/02/2017\"}", Data.class); 
     System.out.println(data.date); 
    } 
} 

出力

日4月2日夜12時00分00秒EDT 2017

// I am located in EDT 

到着日がUTCであると仮定すると、

@JsonFormat(pattern = "MM/dd/yyyy", timezone="UTC") 
Date date; 

出力

土4月1日午後8時00分00秒EDT 2017

デフォルトでは、UTCとして日付を考慮しているように見えます。あなたがCSTにいる場合は、セントラルタイムタイムゾーンを設定することを検討する必要があります(私はUS/Centralと信じています)。

Note あなたの日付の入力は別の議論になります異なるタイムゾーンにあるクライアントから来ることができます。クライアントが特定のタイムゾーンで日付を入力する契約を定義するか、タイムゾーンを追加の入力として明示的に指定する必要があります。クライアント側(存在する場合)は、サーバー側が期待する特定のタイムゾーンに変換します。

+0

これは大きな助けとなりました。タイムゾーンをdb接続プロパティとエンティティのjsonformatに設定しました。これをローカルタイムゾーンに変更することで問題が解決されました。 dbパラメータを設定せずに春にデフォルトタイムゾーンを使用させると、これは起こらなかったはずです – nbpeth

1

putする必要のあるserverTimezoneというデータベース接続URLパラメータがあります。

+0

これは問題の一部でした - 私はUTCとしてdb urlに設定されたプロパティを持っていました - 私はそれを私の現地時間帯に変更する必要がありました。私が単独でデータベースのデフォルトを使用するようにしておいて、春にデフォルトを使用していればうまくいきました。ありがとう! – nbpeth