package Ġio . fluid sonic . time Ċ Ċ import Ġkotlin . time .* ĊĊ Ċ private Ġval Ġiso 8 6 0 1 Regex Ġ= ĠRegex ( Ċ ĉ " ([- + ] ?) P (?: ([- + ]? \\ d +) D )? ( T (?: ([- + ]? \\ d +) H )? (?: ([- + ]? \\ d +) M )? (?: ([- + ]? \\ d + )( ?: [ ., ]( \\ d { 0 , 9 })) ? S )? )? ", Ċ ĉ Regex Option . IGNORE _ CASE Ċ ) Ċ Ċ private Ġconst Ġval Ġnan oseconds PerSecond Ġ= Ġ 1 _ 0 0 0 _ 0 0 0 _ 0 0 0 L Ċ private Ġconst Ġval Ġnan oseconds Per Minute Ġ= Ġnan oseconds PerSecond Ġ* Ġ 6 0 Ċ private Ġconst Ġval Ġnan oseconds Per Hour Ġ= Ġnan oseconds Per Minute Ġ* Ġ 6 0 Ċ private Ġconst Ġval Ġnan oseconds Per Day Ġ= Ġnan oseconds Per Hour Ġ* Ġ 2 4 ĊĊ Ċ // ĠTODO ĠDoes n 't Ġcheck Ġfor Ġoverflow s . ĠImprove . Ċ @ Experimental Time Ċ public Ġfun ĠDuration ( Ċ ĉ days : ĠInt Ġ= Ġ 0 , Ċ ĉ hours : ĠInt Ġ= Ġ 0 , Ċ ĉ minutes : ĠInt Ġ= Ġ 0 , Ċ ĉ seconds : ĠInt Ġ= Ġ 0 , Ċ ĉ nan oseconds : ĠInt Ġ= Ġ 0 , Ċ ): ĠDuration Ġ= ĠDuration . nan oseconds ( Ċ ĉ ( days Ġ* Ġnan oseconds Per Day ) Ġ+ Ċĉ ĉ ( hours Ġ* Ġnan oseconds Per Hour ) Ġ+ Ċĉ ĉ ( minutes Ġ* Ġnan oseconds Per Minute ) Ġ+ Ċĉ ĉ ( seconds Ġ* Ġnan oseconds PerSecond ) Ġ+ Ċĉ ĉ nan oseconds Ċ ) ĊĊ Ċ @ Experimental Time Ċ public Ġfun ĠDuration . Companion . parse ( iso String : ĠCharSequence ): ĠDuration Ġ= Ċ ĉ require NotNull ( parse OrNull ( iso String )) Ġ{ Ġ" Invalid ĠISO - 8 6 0 1 Ġduration : Ġ$ iso String " Ġ} ĊĊ Ċ @ Experimental Time Ċ public Ġfun ĠDuration . Companion . parse OrNull ( iso String : ĠCharSequence ): ĠDuration ? Ġ{ Ċ ĉ val Ġresult Ġ= Ġiso 8 6 0 1 Regex . match Ent ire ( iso String ) Ġ?: Ġreturn Ġnull Ġ// Ġno Ġmatch Ċ ĉ if Ġ( result . group Values [ 3 ] Ġ== Ġ" T ") Ġreturn Ġnull Ġ// Ġempty Ġtime ĊĊ ĉ val Ġdays Text Ġ= Ġresult . group Values [ 2 ] Ċ ĉ val Ġhours Text Ġ= Ġresult . group Values [ 4 ] Ċ ĉ val Ġminutes Text Ġ= Ġresult . group Values [ 5 ] Ċ ĉ val Ġseconds Text Ġ= Ġresult . group Values [ 6 ] Ċ ĉ if Ġ( days Text . isEmpty () Ġ&& Ġhours Text . isEmpty () Ġ&& Ġminutes Text . isEmpty () Ġ&& Ġseconds Text . isEmpty ()) Ġreturn Ġnull Ġ// Ġempty Ġtime ĊĊ ĉ val Ġsecond Fraction String Ġ= Ġresult . group Values [ 7 ] ĊĊ ĉ // ĠTODO ĠMay Ġthrow Ġfor Ġlarge Ġvalues Ġbut Ġshould Ġreturn Ġnull Ġinstead . ĠBe Ġcareful Ġto Ġnot Ġintroduce Ġbox ing Ġwhen Ġimproving . Ċ ĉ val Ġmultiplier Ġ= Ġif Ġ( result . group Values [ 1 ] Ġ== Ġ"- ") Ġ- 1 Ġelse Ġ 1 Ċ ĉ val Ġdays Ġ= Ġparse Number ( days Text , Ġmultiplier Ġ= Ġmultiplier ) Ċ ĉ val Ġhours Ġ= Ġparse Number ( hours Text , Ġmultiplier Ġ= Ġmultiplier ) Ċ ĉ val Ġminutes Ġ= Ġparse Number ( minutes Text , Ġmultiplier Ġ= Ġmultiplier ) Ċ ĉ val Ġseconds Ġ= Ġparse Number ( seconds Text , Ġmultiplier Ġ= Ġmultiplier ) Ċ ĉ val Ġnan oseconds Ġ= Ġparse Fraction ( second Fraction String ) Ġ* Ġif Ġ( seconds Ġ< Ġ 0 ) Ġ- 1 Ġelse Ġ 1 ĊĊ ĉ // ĠTODO ĠMay Ġthrow Ġfor Ġlarge Ġvalues Ġbut Ġshould Ġreturn Ġnull Ġinstead . Ċ ĉ return ĠDuration ( days Ġ= Ġdays , Ġhours Ġ= Ġhours , Ġminutes Ġ= Ġminutes , Ġseconds Ġ= Ġseconds , Ġnan oseconds Ġ= Ġnan oseconds ) Ċ } ĊĊ Ċ private Ġfun Ġparse Fraction ( text : ĠString ): ĠInt Ġ{ Ċ ĉ if Ġ( text . isEmpty ()) Ġreturn Ġ 0 ĊĊ ĉ var Ġfraction Ġ= Ġtext . toInt () Ċ ĉ for Ġ( i Ġin Ġtext . length Ġuntil Ġ 9 ) Ċĉ ĉ fraction Ġ*= Ġ 1 0 ĊĊ ĉ return Ġfraction Ċ } ĊĊ Ċ private Ġfun Ġparse Number ( text : ĠString , Ġmultiplier : ĠInt ): ĠInt Ġ{ Ċ ĉ if Ġ( text . isEmpty ()) Ġreturn Ġ 0 ĊĊ ĉ return Ġtext . toInt () Ġ* Ġmultiplier Ċ } Ċ