package Ġnet . tim afe . lets go 2 . config . timezone Ċ Ċ import Ġjava . lang . String . format Ċ import Ġjava . time . Instant Ċ import Ġjava . time . LocalDate Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . time . Local Time Ċ import Ġjava . time . Month Ċ import Ġjava . time . Offset DateTime Ċ import Ġjava . time . Offset Time Ċ import Ġjava . time . Zone Id Ċ import Ġjava . time . Z onedDateTime Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġnet . tim afe . lets go 2 . L ets go 2 App Ċ import Ġnet . tim afe . lets go 2 . config . Test Security Configuration Ċ import Ġnet . tim afe . lets go 2 . repository . timezone . DateTime Wrapper Ċ import Ġnet . tim afe . lets go 2 . repository . timezone . DateTime Wrapper Repository Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . boot . test . context . SpringBootTest Ċ import Ġorg . springframework . jdbc . core . Jdbc Template Ċ import Ġorg . springframework . jdbc . support . row set . Sql Row Set Ċ import Ġorg . springframework . transaction . annotation . Transactional Ċ Ċ /** Ċ Ġ* ĠIntegration Ġtests Ġfor Ġthe ĠUTC ĠHibernate Ġconfiguration . Ċ Ġ*/ Ċ @ SpringBootTest ( classes Ġ= Ġ[ L ets go 2 App :: class , ĠTest Security Configuration :: class ]) Ċ class ĠHibernate TimeZone IT Ġ{ ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠdateTime Wrapper Repository : ĠDateTime Wrapper Repository ĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġjdbc Template : ĠJdbc Template ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠdateTime Wrapper : ĠDateTime Wrapper ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠdateTime Formatter : ĠDateTime Formatter ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtime Formatter : ĠDateTime Formatter ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdate Formatter : ĠDateTime Formatter ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ ĠdateTime Wrapper Ġ= ĠDateTime Wrapper ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstant Ġ= ĠInstant . parse (" 2 0 1 4 - 1 1 - 1 2 T 0 5 : 5 0 : 0 0 . 0 Z "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal DateTime Ġ= ĠLocalDateTime . parse (" 2 0 1 4 - 1 1 - 1 2 T 0 7 : 5 0 : 0 0 . 0 "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset DateTime Ġ= ĠOffset DateTime . parse (" 2 0 1 1 - 1 2 - 1 4 T 0 8 : 3 0 : 0 0 . 0 Z "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġz onedDateTime Ġ= ĠZ onedDateTime . parse (" 2 0 1 1 - 1 2 - 1 4 T 0 8 : 3 0 : 0 0 . 0 Z "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Time Ġ= ĠLocal Time . parse (" 1 4 : 3 0 : 0 0 "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Time Ġ= ĠOffset Time . parse (" 1 4 : 3 0 : 0 0 + 0 2 : 0 0 "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Date Ġ= ĠLocalDate . parse (" 2 0 1 6 - 0 9 - 1 0 ") ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠdateTime Formatter Ġ= ĠDateTime Formatter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. of Pattern (" yyyy - MM - dd ĠHH : mm : ss . S ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Zone ( Zone Id . of (" UTC ")) ĊĊĠĠĠĠĠĠĠ Ġtime Formatter Ġ= ĠDateTime Formatter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. of Pattern (" HH : mm : ss ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Zone ( Zone Id . of (" UTC ")) ĊĊĠĠĠĠĠĠĠ Ġdate Formatter Ġ= ĠDateTime Formatter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. of Pattern (" yyyy - MM - dd ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Transactional ĊĠĠĠ Ġfun Ġstore Instant With Utc Config ShouldBe Stored On GMT TimeZone () Ġ{ ĊĠĠĠĠĠĠĠ ĠdateTime Wrapper Repository . save And Flush ( dateTime Wrapper ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġgenerate Sql Request (" instant ", ĠdateTime Wrapper . id !! ) ĊĠĠĠĠĠĠĠ Ġval ĠresultSet Ġ= Ġjdbc Template . query For Row Set ( request ) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Value Ġ= ĠdateTime Formatter . format ( dateTime Wrapper . instant ) ĊĊĠĠĠĠĠĠĠ ĠassertThat Date Stored Value Is EqualTo Insert Date Value On GMT TimeZone ( resultSet , Ġexpected Value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Transactional ĊĠĠĠ Ġfun Ġstore LocalDateTime With Utc Config ShouldBe Stored On GMT TimeZone () Ġ{ ĊĠĠĠĠĠĠĠ ĠdateTime Wrapper Repository . save And Flush ( dateTime Wrapper ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġgenerate Sql Request (" local _ date _ time ", ĠdateTime Wrapper . id !! ) ĊĠĠĠĠĠĠĠ Ġval ĠresultSet Ġ= Ġjdbc Template . query For Row Set ( request ) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Value Ġ= ĠdateTime Wrapper ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. local DateTime ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . at Zone ( Zone Id . system Default ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . format ( dateTime Formatter ) ĊĊĠĠĠĠĠĠĠ ĠassertThat Date Stored Value Is EqualTo Insert Date Value On GMT TimeZone ( resultSet , Ġexpected Value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Transactional ĊĠĠĠ Ġfun Ġstore Offset DateTime With Utc Config ShouldBe Stored On GMT TimeZone () Ġ{ ĊĠĠĠĠĠĠĠ ĠdateTime Wrapper Repository . save And Flush ( dateTime Wrapper ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġgenerate Sql Request (" offset _ date _ time ", ĠdateTime Wrapper . id !! ) ĊĠĠĠĠĠĠĠ Ġval ĠresultSet Ġ= Ġjdbc Template . query For Row Set ( request ) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Value Ġ= ĠdateTime Wrapper ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. offset DateTime ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . format ( dateTime Formatter ) ĊĊĠĠĠĠĠĠĠ ĠassertThat Date Stored Value Is EqualTo Insert Date Value On GMT TimeZone ( resultSet , Ġexpected Value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Transactional ĊĠĠĠ Ġfun Ġstore Zone DateTime With Utc Config ShouldBe Stored On GMT TimeZone () Ġ{ ĊĠĠĠĠĠĠĠ ĠdateTime Wrapper Repository . save And Flush ( dateTime Wrapper ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġgenerate Sql Request (" zon ed _ date _ time ", ĠdateTime Wrapper . id !! ) ĊĠĠĠĠĠĠĠ Ġval ĠresultSet Ġ= Ġjdbc Template . query For Row Set ( request ) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Value Ġ= ĠdateTime Wrapper ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. zon ed DateTime ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . format ( dateTime Formatter ) ĊĊĠĠĠĠĠĠĠ ĠassertThat Date Stored Value Is EqualTo Insert Date Value On GMT TimeZone ( resultSet , Ġexpected Value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Transactional ĊĠĠĠ Ġfun Ġstore Local Time With Utc Config ShouldBe Stored On GMT TimeZone Acc ording To H is 1 st Jan 1 9 7 0 Value () Ġ{ ĊĠĠĠĠĠĠĠ ĠdateTime Wrapper Repository . save And Flush ( dateTime Wrapper ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġgenerate Sql Request (" local _ time ", ĠdateTime Wrapper . id !! ) ĊĠĠĠĠĠĠĠ Ġval ĠresultSet Ġ= Ġjdbc Template . query For Row Set ( request ) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Value Ġ= ĠdateTime Wrapper ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. local Time ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . at Date ( LocalDate . of ( 1 9 7 0 , ĠMonth . J AN U ARY , Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . at Zone ( Zone Id . system Default ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . format ( time Formatter ) ĊĊĠĠĠĠĠĠĠ ĠassertThat Date Stored Value Is EqualTo Insert Date Value On GMT TimeZone ( resultSet , Ġexpected Value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Transactional ĊĠĠĠ Ġfun Ġstore Offset Time With Utc Config ShouldBe Stored On GMT TimeZone Acc ording To H is 1 st Jan 1 9 7 0 Value () Ġ{ ĊĠĠĠĠĠĠĠ ĠdateTime Wrapper Repository . save And Flush ( dateTime Wrapper ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġgenerate Sql Request (" offset _ time ", ĠdateTime Wrapper . id !! ) ĊĠĠĠĠĠĠĠ Ġval ĠresultSet Ġ= Ġjdbc Template . query For Row Set ( request ) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Value Ġ= ĠdateTime Wrapper ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. offset Time ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . to Local Time () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . at Date ( LocalDate . of ( 1 9 7 0 , ĠMonth . J AN U ARY , Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . at Zone ( Zone Id . system Default ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . format ( time Formatter ) ĊĊĠĠĠĠĠĠĠ ĠassertThat Date Stored Value Is EqualTo Insert Date Value On GMT TimeZone ( resultSet , Ġexpected Value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Transactional ĊĠĠĠ Ġfun Ġstore LocalDate With Utc Config ShouldBe Stored Without Transformation () Ġ{ ĊĠĠĠĠĠĠĠ ĠdateTime Wrapper Repository . save And Flush ( dateTime Wrapper ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġgenerate Sql Request (" local _ date ", ĠdateTime Wrapper . id !! ) ĊĠĠĠĠĠĠĠ Ġval ĠresultSet Ġ= Ġjdbc Template . query For Row Set ( request ) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Value Ġ= ĠdateTime Wrapper ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. local Date ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . format ( date Formatter ) ĊĊĠĠĠĠĠĠĠ ĠassertThat Date Stored Value Is EqualTo Insert Date Value On GMT TimeZone ( resultSet , Ġexpected Value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Sql Request ( fieldName : ĠString , Ġid : ĠLong ): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġformat (" SELECT Ġ% s ĠFROM Ġj hi _ date _ time _ wrapper Ġwhere Ġid =% d ", ĠfieldName , Ġid ) ĊĊĠĠĠ Ġprivate Ġfun ĠassertThat Date Stored Value Is EqualTo Insert Date Value On GMT TimeZone ( ĊĠĠĠĠĠĠĠ Ġsql Row Set : ĠSql Row Set , ĊĠĠĠĠĠĠĠ Ġexpected Value : ĠString ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( sql Row Set . next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdb Value Ġ= Ġsql Row Set . getString ( 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( db Value ). isNotNull () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( db Value ). isEqualTo ( expected Value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ