web-dev-qa-db-ja.com

ある日失われた

クライアント側では、dd/MM/yyyyの日付形式を使用します。フィールドはTwitterを使用しますbootstrap 3 datetime picker( https://eonasdan.github.io/bootstrap-datetimepicker/

Twitter経由で入力bootstrap 3 datetime picker 2015/07/24
送信したjsonで、次のように表示されます:生年月日: "2015年7月24日"

私のdtoでは、私はやります

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy")
private Date birthdate;

サーバーで日付を受け取ったとき、私のdtoで見る:23/07/2015 19:00

1日が失われます。

何か説明はありますか?

16
robert trudel

JacksonFAQDateHandling ページによると:

Jacksonが構築するTimeZone(Java.util.Calendarなど)に関連付けられているすべての時間オブジェクトuse標準タイムゾーン(GMT)、notローカルタイムゾーン(それが何であれ)。つまり、Jacksonはデフォルトですべての処理にGMTを使用しますnlessに特に指示されています。

あなたの場合、日付は自動的にGMT/UTCに変換されているようです。 UTC変換を回避するために、ローカルタイムゾーンを明示的に提供するようにしてください[質問で述べたようにこの時間が9時間ずれているのはなぜですか? (5時間、3時間など)同じページに]:

_@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="dd/MM/yyyy", timezone="EST")
_

次に、日付を出力するためにDate.toString()を使用していると思います。 that Java Dateクラスはタイムゾーンに依存しませんが、そのtoString()メソッドはシステムのdefaultを使用します印刷前のタイムゾーン。

ここでは、_24/07/2015 00:00 UTC_がtoString()によって_23/07/2015 19:00 EST_に変換されているようです。これらは両方とも同じmomentの時間を表しますが、タイムゾーンが異なります。

12
AimZ

同じ問題があった。 postmanを使用して、クライアントが原因ではないことを確認します。ジャクソンが使用しているタイムゾーンとシステムのタイムゾーンの問題のようです。日付を補正するためにジャクソンの設定を変更する必要がありました

@Configuration

public class JacksonConfig {

    @Bean
    @Primary
    public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
        final Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder = new Jackson2ObjectMapperBuilder();
        jackson2ObjectMapperBuilder.timeZone(TimeZone.getDefault());
        jackson2ObjectMapperBuilder.serializationInclusion(JsonInclude.Include.NON_EMPTY);
        jackson2ObjectMapperBuilder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        return jackson2ObjectMapperBuilder;
    }

}
0
Chrispie

日付ピッカーから日付を選択すると、JavaScriptで同じ問題が発生しました。 。toString()メソッドを使用してフィールドをフォーマットしましたが、関数によって異なる日付が与えられました(私も1日混乱していました)。このような:

var mydate = new Date('2020-04-03'); console.log(mydate.toString());

//Thu Apr 02 2020 20:00:00 GMT-0400 (Eastern Daylight Time)

代わりに。toUTCString()を使用して修正しました。

var mydate = new Date('2020-04-03');

console.log(mydate.toUTCString());

//Fri, 03 Apr 2020 00:00:00 GMT
0
Lorena Pita

AimZの答えは私にこれを指摘したものですが、これらの3行を私のapplication.propertiesファイルに追加し、同じことを達成しました

spring.jackson.date-format = yyyy-MM-dd

spring.jackson.serialization.write-dates-as-timestamps:false

spring.jackson.time-zone:EST