/* ĠCopyright Ġ 2 0 2 1 ĠBetter ĠLtd Ġ( www . better . care ) Ċ Ġ* Ċ Ġ* Ġ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 Ġcare . better . platform . time . format Ċ Ċ import Ġcare . better . platform . time . Open E hr DateTime Formatter Context Ċ import Ġcare . better . platform . time . temporal . Open E hr Field Ċ import Ġcare . better . platform . time . temporal . Open E hr Field State Ċ import Ġjava . time . DateTime Exception Ċ import Ġjava . time . chrono . Iso Ch ron ology Ċ import Ġjava . time . format .* Ċ import Ġjava . time . temporal . Ch rono Field Ċ import Ġjava . util .* Ċ import Ġjava . util . regex . Pattern Ċ Ċ /** Ċ Ġ* Ġ@ author ĠM atic ĠR ib ic Ċ Ġ*/ Ċ class ĠOpen E hr DateTime Formatter Builder Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġformatter Builder Ġ= ĠDateTime Formatter Builder () ĊĠĠĠ Ġprivate Ġvar Ġtime Formatter Builder : ĠDateTime Formatter Builder ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġresolver Style Ġ= ĠResolver Style . SM ART ĊĠĠĠ Ġprivate Ġvar Ġcompact Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġpattern : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġpattern Field States Ġ= Ġmap Of < Open E hr Field , ĠOpen E hr Field State >() ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDATE _ TIME _ REGEX _ PATTERN : ĠPattern Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPattern . compile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ([ Y ]{ 4 }) ? (- )? ([ MX ? ]{ 2 }) ? (- )? ([ DX ? ]{ 2 }) ?( T )? ([ HX ? ]{ 2 }) ?(: )? ([ MX ? ]{ 2 }) ?(: )? ([ SX ? ]{ 2 }) ?( ?: . ([ SX ? ]{ 3 })) ?( Z )? ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPattern . CASE _ INS ENS ITIVE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠCOMP ACT _ PAR TIAL _ DATE _ TIME _ REGEX _ PATTERN : ĠPattern Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPattern . compile (" ([ Y ]{ 4 }) ? ([ MX ? ]{ 2 }) ? ([ DX ? ]{ 2 }) ?( T )? ([ HX ? ]{ 2 }) ? ([ MX ? ]{ 2 }) ? ([ SX ? ]{ 2 }) ?( .[ SX ? ]{ 3 }) ?( Z )? ", ĠPattern . CASE _ INS ENS ITIVE ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠAPP END _ YEAR : Ġ( DateTime Formatter Builder ) Ġ-> ĠDateTime Formatter Builder Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit . append Value ( Ch rono Field . YEAR , Ġ 4 , Ġ 4 , ĠSign Style . EX CE ED S _ PAD ) Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠAPP END _ MONTH : Ġ( DateTime Formatter Builder ) Ġ-> ĠDateTime Formatter Builder Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit . append Value ( Ch rono Field . MONTH _ OF _ YEAR , Ġ 2 , Ġ 2 , ĠSign Style . NOT _ NEGATIVE ) Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠAPP END _ DAY : Ġ( DateTime Formatter Builder ) Ġ-> ĠDateTime Formatter Builder Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit . append Value ( Ch rono Field . DAY _ OF _ MONTH , Ġ 2 , Ġ 2 , ĠSign Style . NOT _ NEGATIVE ) Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠAPP END _ HOUR : Ġ( DateTime Formatter Builder ) Ġ-> ĠDateTime Formatter Builder Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit . append Value ( Ch rono Field . HOUR _ OF _ DAY , Ġ 2 , Ġ 2 , ĠSign Style . NOT _ NEGATIVE ) Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠAPP END _ MINUTE : Ġ( DateTime Formatter Builder ) Ġ-> ĠDateTime Formatter Builder Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit . append Value ( Ch rono Field . MINUTE _ OF _ HOUR , Ġ 2 , Ġ 2 , ĠSign Style . NOT _ NEGATIVE ) Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠAPP END _ SECOND : Ġ( DateTime Formatter Builder ) Ġ-> ĠDateTime Formatter Builder Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit . append Value ( Ch rono Field . SECOND _ OF _ MINUTE , Ġ 2 , Ġ 2 , ĠSign Style . NOT _ NEGATIVE ) Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠAPP END _ NAN O : Ġ( DateTime Formatter Builder ) Ġ-> ĠDateTime Formatter Builder Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit . append Fraction ( Ch rono Field . NAN O _ OF _ SECOND , Ġ 3 , Ġ 9 , Ġtrue ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġappend Pattern ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformatter Builder : ĠDateTime Formatter Builder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpattern : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstrict : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield States : ĠMap < Open E hr Field , ĠOpen E hr Field State > ĊĠĠĠĠĠĠĠ Ġ): ĠDateTime Formatter Builder Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field States [ Open E hr Field . MIN UTES ]. let Ġ{ Ġit Ġ== Ġnull Ġ|| Ġit Ġ== ĠOpen E hr Field State . FOR BID DEN Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġfield States [ Open E hr Field . OFFSET _ SECONDS ] Ġ!= ĠOpen E hr Field State . FOR BID DEN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDateTime Exception (" Invalid Ġpattern Ġ$ pattern ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompact Ġ= Ġis Compact Pattern ( pattern ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġformatter Builder . append Field ( APPEND _ YEAR , Ġfield States [ Open E hr Field . YEAR S ], Ġcompact ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġformatter Builder . append Field ( APPEND _ MONTH , Ġfield States [ Open E hr Field . MONTH S ], Ġcompact , Ġ"- ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġformatter Builder . append Field ( APPEND _ DAY , Ġfield States [ Open E hr Field . DAYS ], Ġcompact , Ġ"- ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field States [ Open E hr Field . DAYS ] Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformatter Builder . append Field ( APPEND _ HOUR , Ġfield States [ Open E hr Field . HOUR S ], Ġcompact , Ġ" T ", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformatter Builder . append Field ( APPEND _ HOUR , Ġfield States [ Open E hr Field . HOUR S ], Ġcompact ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġformatter Builder . append Field ( APPEND _ MINUTE , Ġfield States [ Open E hr Field . MIN UTES ], Ġcompact , Ġ": ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġformatter Builder . append Field ( APPEND _ SECOND , Ġfield States [ Open E hr Field . SECONDS ], Ġcompact , Ġ": ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġformatter Builder . append Field ( APPEND _ NAN O , Ġfield States [ Open E hr Field . NAN OS ], Ġcompact ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtime Ġzone Ġoffset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Zone Appender : Ġ( DateTime Formatter Builder ) Ġ-> ĠDateTime Formatter Builder Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( compact ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . optional Start (). append Offset ("+ HH MM ", Ġ" Z "). optional End () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . optional Start (). append Zone Or Offset Id (). optional End () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset State Ġ= Ġfield States [ Open E hr Field . OFFSET _ SECONDS ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( strict Ġ&& Ġoffset State Ġ== ĠOpen E hr Field State . M AND AT ORY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Zone Appender . invoke ( formatter Builder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( offset State Ġ== ĠOpen E hr Field State . M AND AT ORY Ġ|| Ġoffset State Ġ== ĠOpen E hr Field State . OPTIONAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformatter Builder . optional Start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Zone Appender . invoke ( formatter Builder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformatter Builder . optional End () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġformatter Builder ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠDateTime Formatter Builder . append Field ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp ender : Ġ( DateTime Formatter Builder ) Ġ-> ĠDateTime Formatter Builder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield State : ĠOpen E hr Field State ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompact : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseparator : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforce Separator : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ): ĠDateTime Formatter Builder Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field State Ġ== ĠOpen E hr Field State . M AND AT ORY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! compact Ġ|| Ġforce Separator ) Ġseparator ?. let Ġ{ Ġthis . append Literal ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp ender . invoke ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( field State Ġ== ĠOpen E hr Field State . OPTIONAL Ġ|| Ġfield State Ġ== ĠOpen E hr Field State . UNDEFINED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . optional Start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! compact Ġ|| Ġforce Separator ) Ġseparator ?. let Ġ{ Ġthis . append Literal ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp ender . invoke ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . optional End () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Field States ( pattern : ĠString ): ĠMap < Open E hr Field , ĠOpen E hr Field State > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatcher Ġ= ĠDATE _ TIME _ REGEX _ PATTERN . matcher ( pattern . uppercase ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! matcher . matches ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDateTime Exception (" Invalid Ġpattern Ġ$ pattern ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġyear Ġ= Ġmatcher . group ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmonth Ġ= Ġmatcher . group ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġday Ġ= Ġmatcher . group ( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhour Ġ= Ġmatcher . group ( 7 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġminute Ġ= Ġmatcher . group ( 9 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecond Ġ= Ġmatcher . group ( 1 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnan ose cond Ġ= Ġmatcher . group ( 1 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Zone Ġ= Ġmatcher . group ( 1 3 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( minute Ġ== Ġnull Ġ|| Ġminute Ġ== Ġ" XX ") Ġ&& Ġtime Zone Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDateTime Exception (" Invalid Ġpattern Ġ$ pattern ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield States Ġ= Ġmutable Map Of < Open E hr Field , ĠOpen E hr Field State >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Field State ( field States , ĠOpen E hr Field . YEAR S , Ġyear , Ġ" YYYY ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Field State ( field States , ĠOpen E hr Field . MONTH S , Ġmonth , Ġ" MM ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Field State ( field States , ĠOpen E hr Field . DAYS , Ġday , Ġ" DD ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Field State ( field States , ĠOpen E hr Field . HOUR S , Ġhour , Ġ" HH ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Field State ( field States , ĠOpen E hr Field . MIN UTES , Ġminute , Ġ" MM ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Field State ( field States , ĠOpen E hr Field . SECONDS , Ġsecond , Ġ" SS ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Field State ( field States , ĠOpen E hr Field . NAN OS , Ġnan ose cond , Ġ" SS S ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Zone Ġ!= Ġnull Ġ-> ĠOpen E hr Field State . M AND AT ORY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! exist Date Fields ( field States ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( field States [ Open E hr Field . SECONDS ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOpen E hr Field State . M AND AT ORY , ĠOpen E hr Field State . OPTIONAL , ĠOpen E hr Field State . UNDEFINED Ġ-> ĠOpen E hr Field State . OPTIONAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĠOpen E hr Field State . FOR BID DEN Ġ-> Ġwhen Ġ( field States [ Open E hr Field . MIN UTES ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOpen E hr Field State . M AND AT ORY , ĠOpen E hr Field State . OPTIONAL , ĠOpen E hr Field State . UNDEFINED Ġ-> ĠOpen E hr Field State . OPTIONAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠOpen E hr Field State . FOR BID DEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield States [ Open E hr Field . MIN UTES ]?. possible Ġ== Ġtrue Ġ-> ĠOpen E hr Field State . OPTIONAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield States [ Open E hr Field . SECONDS ] Ġ== Ġnull Ġ&& Ġfield States [ Open E hr Field . MIN UTES ]?. possible Ġ== Ġtrue Ġ-> ĠOpen E hr Field State . OPTIONAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield States [ Open E hr Field . SECONDS ]?. possible Ġ!= Ġtrue Ġ&& Ġfield States [ Open E hr Field . MIN UTES ]?. possible Ġ!= Ġtrue Ġ-> ĠOpen E hr Field State . FOR BID DEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield States [ Open E hr Field . OFFSET _ SECONDS ] Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfield States ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġexist Date Fields ( field States : ĠMap < Open E hr Field , ĠOpen E hr Field State >) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Open E hr Field . YEAR S , ĠOpen E hr Field . MONTH S , ĠOpen E hr Field . DAYS ). any Ġ{ Ġfield States [ it ] Ġ!= Ġnull Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġis Compact Pattern ( pattern : ĠString ?) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpattern ?. isNotBlank () Ġ== Ġtrue Ġ&& Ġpattern . uppercase (). let Ġ{ Ġit Ġ!= Ġ" YYYY " Ġ&& Ġit Ġ!= Ġ" HH " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& ĠCOMP ACT _ PAR TIAL _ DATE _ TIME _ REGEX _ PATTERN . matcher ( pattern ). matches () ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġput Field State ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield States : ĠMutable Map < Open E hr Field , ĠOpen E hr Field State >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield : ĠOpen E hr Field , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Value : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Pattern Value : ĠString ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( actual Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Pattern Value Ġ-> Ġfield States [ field ] Ġ= ĠOpen E hr Field State . M AND AT ORY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"? ". repeat ( expected Pattern Value . length ) Ġ-> Ġfield States [ field ] Ġ= ĠOpen E hr Field State . OPTIONAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" X ". repeat ( expected Pattern Value . length ) Ġ-> Ġfield States [ field ] Ġ= ĠOpen E hr Field State . FOR BID DEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġappend Pattern ( pattern : ĠString ?, Ġstrict : ĠBoolean ): ĠOpen E hr DateTime Formatter Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatcher Ġ= ĠDATE _ TIME _ REGEX _ PATTERN . matcher ( pattern ?. uppercase () Ġ?: Ġ"") ĊĠĠĠĠĠĠĠ Ġif Ġ( pattern ?. isNotBlank () Ġ== Ġtrue Ġ&& Ġ! matcher . matches ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDateTime Exception (" Invalid Ġpattern Ġ$ pattern ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . pattern Ġ= Ġpattern ĊĠĠĠĠĠĠĠ Ġresolver Style Ġ= Ġif Ġ( strict ) ĠResolver Style . STRICT Ġelse ĠResolver Style . SM ART ĊĊĠĠĠĠĠĠĠ Ġif Ġ( pattern . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . pattern Ġ= Ġpattern ĊĠĠĠĠĠĠĠĠĠĠĠ Ġformatter Builder . append ( DateTime Format ters . partial Offset DateTime Formatter ( compact , Ġfalse , Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Formatter Builder Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( time Formatter Builder Ġ?: ĠDateTime Formatter Builder ()). append ( DateTime Format ters . partial Offset Time Formatter ( compact , Ġfalse , Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpattern Field States Ġ= ĠOpen E hr Field . values (). map Ġ{ Ġit Ġto ĠOpen E hr Field State . UNDEFINED Ġ}. toMap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompact Ġ= Ġis Compact Pattern ( pattern ) ĊĠĠĠĠĠĠĠ Ġpattern Field States Ġ= Ġget Field States ( pattern ) ĊĊĠĠĠĠĠĠĠ Ġappend Pattern ( formatter Builder , Ġpattern , Ġstrict , Ġpattern Field States ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġto Open E hr Formatter ( locale : ĠLocale ? Ġ= Ġnull ): ĠOpen E hr DateTime Formatter Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalid Locale Ġ= Ġlocale Ġ?: ĠLocale . getDefault ( Locale . Category . FORMAT ) ĊĠĠĠĠĠĠĠ Ġval Ġdefault Formatter Ġ= Ġto Formatter ( formatter Builder , Ġvalid Locale ) ĊĠĠĠĠĠĠĠ Ġreturn ĠOpen E hr DateTime Formatter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Formatter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( time Formatter Builder Ġ!= Ġnull ) Ġto Formatter ( time Formatter Builder !! , Ġvalid Locale ) Ġelse Ġdefault Formatter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOpen E hr DateTime Formatter Context ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpattern Field States . toMap (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpattern , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver Style , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompact , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalid Locale ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġto Formatter ( formatter Builder : ĠDateTime Formatter Builder , Ġlocale : ĠLocale ): ĠDateTime Formatter Ġ= Ġformatter Builder ĊĠĠĠĠĠĠĠ Ġ. to Formatter ( locale ) ĊĠĠĠĠĠĠĠ Ġ. with Ch ron ology ( Iso Ch ron ology . INSTANCE ) ĊĠĠĠĠĠĠĠ Ġ. with Decimal Style ( Decimal Style . STANDARD ) ĊĠĠĠĠĠĠĠ Ġ. with Resolver Style ( resolver Style ) Ċ } Ċ