/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 - 2 0 2 1 . Ġdata 2 viz Ġs Ãł rl . Ċ Ġ* Ċ Ġ* Ġ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* Ġ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* Ġ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* Ġ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* Ġ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġ Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġio . data 2 viz . scale . intervals Ċ Ċ import Ġkotlinx . datetime . Instant Ċ import Ġkotlinx . datetime . LocalDateTime Ċ import Ġkotlinx . datetime . TimeZone Ċ import Ġkotlinx . datetime . to Instant Ċ import Ġkotlin . test . Test Ċ Ċ @ Suppress (" DE PREC ATION ") Ċ class ĠHour Tests Ġ: ĠTest Date () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġzone Local Ġ= Ġzone Local () ĊĊĠĠĠ Ġprivate Ġfun Ġdate UTC ( y : ĠInt , Ġmo : ĠInt , Ġd : ĠInt , Ġh : ĠInt Ġ= Ġ 0 , Ġmi : Int Ġ= Ġ 0 , Ġs : Int Ġ= Ġ 0 , Ġms : ĠInt Ġ= Ġ 0 ) Ġ= ĊĠĠĠĠĠĠĠ ĠLocalDateTime ( y , Ġmo , Ġd , Ġh , Ġmi , Ġs , Ġms ). to Instant ( TimeZone . UTC ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġhour _ floor _ date _ returns _ hours () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= ĠInter vals . time Hour ĊĊĠĠĠĠĠĠĠ Ġtime . floor ( TimeZone . UTC , Ġdate UTC ( 2 0 1 0 , Ġ 1 2 , Ġ 3 1 , Ġ 2 3 , Ġ 5 9 )) ĠshouldBe Ġdate UTC ( 2 0 1 0 , Ġ 1 2 , Ġ 3 1 , Ġ 2 3 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġtime . floor ( TimeZone . UTC , Ġdate UTC ( 2 0 1 1 , Ġ 1 , Ġ 1 , Ġ 0 , Ġ 0 )) ĠshouldBe Ġdate UTC ( 2 0 1 1 , Ġ 1 , Ġ 1 , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġtime . floor ( TimeZone . UTC , Ġdate UTC ( 2 0 1 1 , Ġ 1 , Ġ 1 , Ġ 0 , Ġ 1 )) ĠshouldBe Ġdate UTC ( 2 0 1 1 , Ġ 1 , Ġ 1 , Ġ 0 , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġhour _ ceil _ returns _ hours () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Ġ( Intervals . time Hour ) Ġ{ ĠTime Zone . UTC . ceil ( date UTC ( 2 0 1 0 , Ġ 1 2 , Ġ 3 1 , Ġ 2 3 , Ġ 5 9 )) Ġ} ĠshouldBe Ġdate UTC ( 2 0 1 1 , Ġ 1 , Ġ 1 , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġwith Ġ( Intervals . time Hour ) Ġ{ ĠTime Zone . UTC . ceil ( date UTC ( 2 0 1 1 , Ġ 1 , Ġ 1 , Ġ 0 , Ġ 0 )) Ġ} ĠshouldBe Ġdate UTC ( 2 0 1 1 , Ġ 1 , Ġ 1 , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Ġ( Intervals . time Hour ) Ġ{ ĠTime Zone . UTC . ceil ( date UTC ( 2 0 1 1 , Ġ 1 , Ġ 1 , Ġ 0 , Ġ 1 )) Ġ} ĠshouldBe Ġdate UTC ( 2 0 1 1 , Ġ 1 , Ġ 1 , Ġ 1 , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġhour _ offset _ date _ step _ does _ not _ modify _ the _ passed _ date () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= ĠInter vals . time Hour ĊĠĠĠĠĠĠĠ Ġval Ġdate Ġ= Ġdate UTC ( 2 0 1 0 , Ġ 1 2 , Ġ 3 1 , Ġ 2 3 , Ġ 5 9 , Ġ 5 9 , Ġ 9 9 9 ) ĊĊĠĠĠĠĠĠĠ Ġtime . offset ( TimeZone . UTC , Ġdate , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġdate ĠshouldBe Ġdate UTC ( 2 0 1 0 , Ġ 1 2 , Ġ 3 1 , Ġ 2 3 , Ġ 5 9 , Ġ 5 9 , Ġ 9 9 9 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġhour _ offset _ date _ step _ does _ not _ round _ the _ passed _ date () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= ĠInter vals . time Hour ĊĠĠĠĠĠĠĠ Ġval Ġdate 1 Ġ= Ġdate UTC ( 2 0 1 0 , Ġ 1 2 , Ġ 3 1 , Ġ 2 3 , Ġ 5 9 , Ġ 5 9 , Ġ 4 5 6 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdate 2 Ġ= Ġdate UTC ( 2 0 1 1 , Ġ 1 , Ġ 1 , Ġ 0 , Ġ 5 9 , Ġ 5 9 , Ġ 4 5 6 ) ĊĠĠĠĠĠĠĠ Ġtime . offset ( TimeZone . UTC , Ġdate 1 , Ġ 1 ) ĠshouldBe Ġdate 2 ĊĊĠĠĠĠĠĠĠ Ġval Ġdate 3 Ġ= Ġdate UTC ( 2 0 1 0 , Ġ 1 2 , Ġ 3 1 , Ġ 2 1 , Ġ 5 9 , Ġ 5 9 , Ġ 4 5 6 ) ĊĠĠĠĠĠĠĠ Ġtime . offset ( TimeZone . UTC , Ġdate 1 , Ġ- 2 ) ĠshouldBe Ġdate 3 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġhour _ offset _ allows _ negative _ positive _ zero _ step () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= ĠInter vals . time Hour ĊĊĠĠĠĠĠĠĠ Ġtime . offset ( TimeZone . UTC , Ġdate UTC ( 2 0 1 0 , Ġ 1 2 , Ġ 3 1 , Ġ 1 2 , Ġ 0 ), Ġ- 1 ) ĠshouldBe Ġdate UTC ( 2 0 1 0 , Ġ 1 2 , Ġ 3 1 , Ġ 1 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġtime . offset ( TimeZone . UTC , Ġdate UTC ( 2 0 1 1 , Ġ 1 , Ġ 1 , Ġ 1 , Ġ 0 ), Ġ- 2 ) ĠshouldBe Ġdate UTC ( 2 0 1 0 , Ġ 1 2 , Ġ 3 1 , Ġ 2 3 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġtime . offset ( TimeZone . UTC , Ġdate UTC ( 2 0 1 1 , Ġ 1 , Ġ 1 , Ġ 0 , Ġ 0 ), Ġ- 1 ) ĠshouldBe Ġdate UTC ( 2 0 1 0 , Ġ 1 2 , Ġ 3 1 , Ġ 2 3 , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġtime . offset ( TimeZone . UTC , Ġdate UTC ( 2 0 1 0 , Ġ 1 2 , Ġ 3 1 , Ġ 1 1 , Ġ 0 ), Ġ 1 ) ĠshouldBe Ġdate UTC ( 2 0 1 0 , Ġ 1 2 , Ġ 3 1 , Ġ 1 2 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġtime . offset ( TimeZone . UTC , Ġdate UTC ( 2 0 1 0 , Ġ 1 2 , Ġ 3 1 , Ġ 2 3 , Ġ 0 ), Ġ 2 ) ĠshouldBe Ġdate UTC ( 2 0 1 1 , Ġ 1 , Ġ 1 , Ġ 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġtime . offset ( TimeZone . UTC , Ġdate UTC ( 2 0 1 0 , Ġ 1 2 , Ġ 3 1 , Ġ 2 3 , Ġ 0 ), Ġ 1 ) ĠshouldBe Ġdate UTC ( 2 0 1 1 , Ġ 1 , Ġ 1 , Ġ 0 , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdate 1 Ġ= Ġdate UTC ( 2 0 1 0 , Ġ 1 2 , Ġ 3 1 , Ġ 2 3 , Ġ 5 9 , Ġ 5 9 , Ġ 9 9 9 ) ĊĠĠĠĠĠĠĠ Ġtime . offset ( TimeZone . UTC , Ġdate 1 , Ġ 0 ) ĠshouldBe Ġdate 1 ĊĠĠĠĠĠĠĠ Ġval Ġdate 2 Ġ= Ġdate UTC ( 2 0 1 0 , Ġ 1 2 , Ġ 3 1 , Ġ 2 3 , Ġ 5 9 , Ġ 5 8 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġtime . offset ( TimeZone . UTC , Ġdate 2 , Ġ 0 ) ĠshouldBe Ġdate 2 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġhour _ range _ start _ stop _ c ans _ k ip _ hours () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= ĠInter vals . time Hour ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate UTC ( 2 0 1 1 , Ġ 2 , Ġ 1 , Ġ 1 , Ġ 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate UTC ( 2 0 1 1 , Ġ 2 , Ġ 1 , Ġ 4 , Ġ 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate UTC ( 2 0 1 1 , Ġ 2 , Ġ 1 , Ġ 7 , Ġ 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate UTC ( 2 0 1 1 , Ġ 2 , Ġ 1 , Ġ 1 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrange Ġ= Ġwith ( time ) Ġ{ ĠTime Zone . UTC . range ( date UTC ( 2 0 1 1 , Ġ 2 , Ġ 1 , Ġ 1 , Ġ 0 ), Ġdate UTC ( 2 0 1 1 , Ġ 2 , Ġ 1 , Ġ 1 3 , Ġ 0 ), Ġ 3 ) Ġ} ĊĠĠĠĠĠĠĠ Ġrange . forEach Indexed Ġ{ Ġindex , Ġr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr ĠshouldBe Ġresult [ index ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġhour _ range _ start _ stop _ returns _ hours _ between _ start _ inclusive _ and _ stop _ exclusive () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= ĠInter vals . time Hour ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate UTC ( 2 0 1 0 , Ġ 1 2 , Ġ 3 1 , Ġ 2 3 , Ġ 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate UTC ( 2 0 1 1 , Ġ 1 , Ġ 1 , Ġ 0 , Ġ 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate UTC ( 2 0 1 1 , Ġ 1 , Ġ 1 , Ġ 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrange Ġ= Ġwith ( time ) Ġ{ ĠTime Zone . UTC . range ( date UTC ( 2 0 1 0 , Ġ 1 2 , Ġ 3 1 , Ġ 2 3 , Ġ 0 ), Ġdate UTC ( 2 0 1 1 , Ġ 1 , Ġ 1 , Ġ 2 , Ġ 0 )) Ġ} ĊĠĠĠĠĠĠĠ Ġrange . forEach Indexed Ġ{ Ġindex , Ġr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr ĠshouldBe Ġresult [ index ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġhour _ range _ start _ stop _ returns _ hours () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= ĠInter vals . time Hour ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate UTC ( 2 0 1 0 , Ġ 1 2 , Ġ 3 1 , Ġ 2 3 , Ġ 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate UTC ( 2 0 1 1 , Ġ 1 , Ġ 1 , Ġ 0 , Ġ 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate UTC ( 2 0 1 1 , Ġ 1 , Ġ 1 , Ġ 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrange Ġ= Ġwith ( time ) Ġ{ ĠTime Zone . UTC . range ( date UTC ( 2 0 1 0 , Ġ 1 2 , Ġ 3 1 , Ġ 2 3 , Ġ 0 ), Ġdate UTC ( 2 0 1 1 , Ġ 1 , Ġ 1 , Ġ 2 , Ġ 0 )) Ġ} ĊĠĠĠĠĠĠĠ Ġrange . forEach Indexed Ġ{ Ġindex , Ġr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr ĠshouldBe Ġresult [ index ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtime Hour _ floor _ ob serves _ start _ of _ DST () Ġ{ ĊĠĠĠĠĠĠĠ ĠInter vals . time Hour . floor ( TimeZone . UTC , Ġdate UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , ĠĠ 8 , Ġ 5 9 )) ĠshouldBe Ġdate UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , Ġ 8 ) ĊĠĠĠĠĠĠĠ ĠInter vals . time Hour . floor ( TimeZone . UTC , Ġdate UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , ĠĠ 9 , Ġ 0 )) ĠshouldBe Ġdate UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , Ġ 9 ) ĊĠĠĠĠĠĠĠ ĠInter vals . time Hour . floor ( TimeZone . UTC , Ġdate UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , ĠĠ 9 , Ġ 1 )) ĠshouldBe Ġdate UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , Ġ 9 ) ĊĠĠĠĠĠĠĠ ĠInter vals . time Hour . floor ( TimeZone . UTC , Ġdate UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , ĠĠ 9 , Ġ 5 9 )) ĠshouldBe Ġdate UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , Ġ 9 ) ĊĠĠĠĠĠĠĠ ĠInter vals . time Hour . floor ( TimeZone . UTC , Ġdate UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , Ġ 1 0 , Ġ 0 )) ĠshouldBe Ġdate UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , Ġ 1 0 ) ĊĠĠĠĠĠĠĠ ĠInter vals . time Hour . floor ( TimeZone . UTC , Ġdate UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , Ġ 1 0 , Ġ 1 )) ĠshouldBe Ġdate UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , Ġ 1 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtime Hour _ floor _ ob serves _ end _ of _ DST () Ġ{ ĊĠĠĠĠĠĠĠ ĠInter vals . time Hour . floor ( TimeZone . UTC , Ġdate UTC ( 2 0 1 1 , Ġ 1 1 , Ġ 6 , Ġ 7 , Ġ 5 9 )) ĠshouldBe Ġdate UTC ( 2 0 1 1 , Ġ 1 1 , Ġ 6 , Ġ 7 ) ĊĠĠĠĠĠĠĠ ĠInter vals . time Hour . floor ( TimeZone . UTC , Ġdate UTC ( 2 0 1 1 , Ġ 1 1 , Ġ 6 , Ġ 8 , Ġ 0 )) ĠshouldBe Ġdate UTC ( 2 0 1 1 , ĠĠ 1 1 , Ġ 6 , Ġ 8 ) ĊĠĠĠĠĠĠĠ ĠInter vals . time Hour . floor ( TimeZone . UTC , Ġdate UTC ( 2 0 1 1 , Ġ 1 1 , Ġ 6 , Ġ 8 , Ġ 1 )) ĠshouldBe Ġdate UTC ( 2 0 1 1 , ĠĠ 1 1 , Ġ 6 , Ġ 8 ) ĊĠĠĠĠĠĠĠ ĠInter vals . time Hour . floor ( TimeZone . UTC , Ġdate UTC ( 2 0 1 1 , Ġ 1 1 , Ġ 6 , Ġ 8 , Ġ 5 9 )) ĠshouldBe Ġdate UTC ( 2 0 1 1 , Ġ 1 1 , Ġ 6 , Ġ 8 ) ĊĠĠĠĠĠĠĠ ĠInter vals . time Hour . floor ( TimeZone . UTC , Ġdate UTC ( 2 0 1 1 , Ġ 1 1 , Ġ 6 , Ġ 9 , Ġ 0 )) ĠshouldBe Ġdate UTC ( 2 0 1 1 , ĠĠ 1 1 , Ġ 6 , Ġ 9 ) ĊĠĠĠĠĠĠĠ ĠInter vals . time Hour . floor ( TimeZone . UTC , Ġdate UTC ( 2 0 1 1 , Ġ 1 1 , Ġ 6 , Ġ 9 , Ġ 1 )) ĠshouldBe Ġdate UTC ( 2 0 1 1 , ĠĠ 1 1 , Ġ 6 , Ġ 9 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtime Hour _ ceil _ ob serves _ start _ of _ DST () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Ġ( Intervals . time Hour ) Ġ{ ĠTime Zone . UTC . ceil ( date UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , ĠĠ 8 , Ġ 5 9 )) Ġ} ĠshouldBe Ġdate UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , Ġ 9 ) ĊĠĠĠĠĠĠĠ Ġwith Ġ( Intervals . time Hour ) Ġ{ ĠTime Zone . UTC . ceil ( date UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , ĠĠ 9 , Ġ 0 )) Ġ} ĠshouldBe Ġdate UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , Ġ 9 ) ĊĠĠĠĠĠĠĠ Ġwith Ġ( Intervals . time Hour ) Ġ{ ĠTime Zone . UTC . ceil ( date UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , ĠĠ 9 , Ġ 1 )) Ġ} ĠshouldBe Ġdate UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , Ġ 1 0 ) ĊĠĠĠĠĠĠĠ Ġwith Ġ( Intervals . time Hour ) Ġ{ ĠTime Zone . UTC . ceil ( date UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , ĠĠ 9 , Ġ 5 9 )) Ġ} ĠshouldBe Ġdate UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , Ġ 1 0 ) ĊĠĠĠĠĠĠĠ Ġwith Ġ( Intervals . time Hour ) Ġ{ ĠTime Zone . UTC . ceil ( date UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , Ġ 1 0 , Ġ 0 )) Ġ} ĠshouldBe Ġdate UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , Ġ 1 0 ) ĊĠĠĠĠĠĠĠ Ġwith Ġ( Intervals . time Hour ) Ġ{ ĠTime Zone . UTC . ceil ( date UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , Ġ 1 0 , Ġ 1 )) Ġ} ĠshouldBe Ġdate UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , Ġ 1 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtime Hour _ ceil _ ob serves _ end _ of _ DST () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Ġ( Intervals . time Hour ) Ġ{ ĠTime Zone . UTC . ceil ( date UTC ( 2 0 1 1 , Ġ 1 1 , Ġ 6 , Ġ 7 , Ġ 5 9 )) Ġ} ĠshouldBe Ġdate UTC ( 2 0 1 1 , Ġ 1 1 , Ġ 6 , Ġ 8 ) ĊĠĠĠĠĠĠĠ Ġwith Ġ( Intervals . time Hour ) Ġ{ ĠTime Zone . UTC . ceil ( date UTC ( 2 0 1 1 , Ġ 1 1 , Ġ 6 , Ġ 8 , Ġ 0 )) Ġ} ĠshouldBe Ġdate UTC ( 2 0 1 1 , ĠĠ 1 1 , Ġ 6 , Ġ 8 ) ĊĠĠĠĠĠĠĠ Ġwith Ġ( Intervals . time Hour ) Ġ{ ĠTime Zone . UTC . ceil ( date UTC ( 2 0 1 1 , Ġ 1 1 , Ġ 6 , Ġ 8 , Ġ 1 )) Ġ} ĠshouldBe Ġdate UTC ( 2 0 1 1 , ĠĠ 1 1 , Ġ 6 , Ġ 9 ) ĊĠĠĠĠĠĠĠ Ġwith Ġ( Intervals . time Hour ) Ġ{ ĠTime Zone . UTC . ceil ( date UTC ( 2 0 1 1 , Ġ 1 1 , Ġ 6 , Ġ 8 , Ġ 5 9 )) Ġ} ĠshouldBe Ġdate UTC ( 2 0 1 1 , Ġ 1 1 , Ġ 6 , Ġ 9 ) ĊĠĠĠĠĠĠĠ Ġwith Ġ( Intervals . time Hour ) Ġ{ ĠTime Zone . UTC . ceil ( date UTC ( 2 0 1 1 , Ġ 1 1 , Ġ 6 , Ġ 9 , Ġ 0 )) Ġ} ĠshouldBe Ġdate UTC ( 2 0 1 1 , ĠĠ 1 1 , Ġ 6 , Ġ 9 ) ĊĠĠĠĠĠĠĠ Ġwith Ġ( Intervals . time Hour ) Ġ{ ĠTime Zone . UTC . ceil ( date UTC ( 2 0 1 1 , Ġ 1 1 , Ġ 6 , Ġ 9 , Ġ 1 )) Ġ} ĠshouldBe Ġdate UTC ( 2 0 1 1 , ĠĠ 1 1 , Ġ 6 , Ġ 1 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtime Hour _ range _ ob serves _ start _ of _ DST () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Ġ= ĠLocalDateTime ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , Ġ 1 , Ġ 0 ). to Instant ( zone Local ) ĊĠĠĠĠĠĠĠ Ġval Ġend Ġ= ĠLocalDateTime ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , Ġ 5 , Ġ 0 ). to Instant ( zone Local ) ĊĠĠĠĠĠĠĠ Ġwith ( Intervals . time Hour ) Ġ{ ĠTime Zone . UTC . range ( start , Ġend ) Ġ} ĠshouldBe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , Ġ 9 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , Ġ 1 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate UTC ( 2 0 1 1 , Ġ 3 , Ġ 1 3 , Ġ 1 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtime Hour _ range _ ob serves _ end _ of _ DST () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Ġ= ĠLocalDateTime ( 2 0 1 1 , Ġ 1 1 , Ġ 6 , Ġ 0 , Ġ 0 ). to Instant ( TimeZone . of (" America / Los _ An ge les ")) ĊĠĠĠĠĠĠĠ Ġval Ġend Ġ= ĠLocalDateTime ( 2 0 1 1 , Ġ 1 1 , Ġ 6 , Ġ 2 , Ġ 0 ). to Instant ( TimeZone . of (" America / Los _ An ge les ")) ĊĠĠĠĠĠĠĠ Ġwith ( Intervals . time Hour ) Ġ{ ĠTime Zone . UTC . range ( start , Ġend ) Ġ} ĠshouldBe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate UTC ( 2 0 1 1 , Ġ 1 1 , Ġ 6 , Ġ 7 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate UTC ( 2 0 1 1 , Ġ 1 1 , Ġ 6 , Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate UTC ( 2 0 1 1 , Ġ 1 1 , Ġ 6 , Ġ 9 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtime Hour _ step _ returns _ expected _ result () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġdate UTC ( 2 0 0 8 , Ġ 1 2 , Ġ 3 0 , Ġ 1 2 , Ġ 4 7 ) ĊĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġdate UTC ( 2 0 0 8 , Ġ 1 2 , Ġ 3 1 , Ġ 1 3 , Ġ 5 7 ) ĊĠĠĠĠĠĠĠ Ġvar Ġevery Ġ= Ġwith ( Intervals . time Hour ) Ġ{ ĠTime Zone . UTC . every ( 4 ) Ġ} ĊĠĠĠĠĠĠĠ Ġwith ( every ) Ġ{ ĠTime Zone . UTC . range ( start , Ġend ) Ġ} ĠshouldBe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate UTC ( 2 0 0 8 , Ġ 1 2 , Ġ 3 0 , Ġ 1 6 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate UTC ( 2 0 0 8 , Ġ 1 2 , Ġ 3 0 , Ġ 2 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate UTC ( 2 0 0 8 , Ġ 1 2 , Ġ 3 1 , Ġ 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate UTC ( 2 0 0 8 , Ġ 1 2 , Ġ 3 1 , Ġ 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate UTC ( 2 0 0 8 , Ġ 1 2 , Ġ 3 1 , Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate UTC ( 2 0 0 8 , Ġ 1 2 , Ġ 3 1 , Ġ 1 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ= Ġwith ( Intervals . time Hour ) Ġ{ ĠTime Zone . UTC . every ( 1 2 ) Ġ} ĊĠĠĠĠĠĠĠ Ġwith ( every ) Ġ{ ĠTime Zone . UTC . range ( start , Ġend ) Ġ} ĠshouldBe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate UTC ( 2 0 0 8 , Ġ 1 2 , Ġ 3 1 , Ġ 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate UTC ( 2 0 0 8 , Ġ 1 2 , Ġ 3 1 , Ġ 1 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtime Hour _ returns _ hours _ ac ross _ the _ DST () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Ġ= ĠInstant . from Epoch Milliseconds ( 1 4 7 8 4 2 2 8 0 0 0 0 0 Ġ- Ġ 2 Ġ* Ġ 3 6 0 0 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġend Ġ= ĠInstant . from Epoch Milliseconds ( 1 4 7 8 4 2 2 8 0 0 0 0 0 Ġ+ Ġ 2 Ġ* Ġ 3 6 0 0 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġwith Ġ( Intervals . time Hour ) Ġ{ ĠTime Zone . UTC . range ( start , Ġend ) Ġ}. map Ġ{ Ġit . to Epoch Milliseconds () Ġ} ĠshouldBe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 4 7 8 4 1 5 6 0 0 0 0 0 L , ĠĠĠĠ Ġ// ĠSun ĠNov Ġ 0 6 Ġ 2 0 1 6 Ġ 0 0 : 0 0 : 0 0 ĠGMT - 0 7 0 0 Ġ( P DT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 4 7 8 4 1 9 2 0 0 0 0 0 L , ĠĠĠĠ Ġ// ĠSun ĠNov Ġ 0 6 Ġ 2 0 1 6 Ġ 0 1 : 0 0 : 0 0 ĠGMT - 0 7 0 0 Ġ( P DT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 4 7 8 4 2 2 8 0 0 0 0 0 L , ĠĠĠĠ Ġ// ĠSun ĠNov Ġ 0 6 Ġ 2 0 1 6 Ġ 0 1 : 0 0 : 0 0 ĠGMT - 0 8 0 0 Ġ( P DT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 4 7 8 4 2 6 4 0 0 0 0 0 L ĠĠĠĠĠ Ġ// ĠSun ĠNov Ġ 0 6 Ġ 2 0 1 6 Ġ 0 2 : 0 0 : 0 0 ĠGMT - 0 8 0 0 Ġ( P DT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ