/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 6 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . example . android . sun sh ine . utilities Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . text . format . Date Utils Ċ Ċ import Ġcom . example . android . sun sh ine . R Ċ import Ġcom . example . android . sun sh ine . utilities . Sun sh ine Date Utils . DAY _ IN _ M ILL IS Ċ Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util . TimeZone Ċ Ċ /** Ċ Ġ* ĠClass Ġfor Ġhandling Ġdate Ġconversions Ġthat Ġare Ġuseful Ġfor ĠSun sh ine . Ċ Ġ*/ Ċ object ĠSun sh ine Date Utils Ġ{ ĊĊĠĠĠ Ġval ĠSE COND _ IN _ M ILL IS : ĠLong Ġ= Ġ 1 0 0 0 ĊĠĠĠ Ġval ĠMIN UTE _ IN _ M ILL IS Ġ= ĠSE COND _ IN _ M ILL IS Ġ* Ġ 6 0 ĊĠĠĠ Ġval ĠHO UR _ IN _ M ILL IS Ġ= ĠMIN UTE _ IN _ M ILL IS Ġ* Ġ 6 0 ĊĠĠĠ Ġval ĠDAY _ IN _ M ILL IS Ġ= ĠHO UR _ IN _ M ILL IS Ġ* Ġ 2 4 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġreturns Ġthe Ġnumber Ġof Ġdays Ġsince Ġthe Ġepoch Ġ( January Ġ 0 1 , Ġ 1 9 7 0 , Ġ 1 2 : 0 0 ĠMid night ĠUTC ) ĊĠĠĠĠ Ġ* Ġin ĠUTC Ġtime Ġfrom Ġthe Ġcurrent Ġdate . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdate ĠA Ġdate Ġin Ġmilliseconds Ġin Ġlocal Ġtime . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġnumber Ġof Ġdays Ġin ĠUTC Ġtime Ġfrom Ġthe Ġepoch . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Day Number ( date : ĠLong ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtz Ġ= ĠTime Zone . getDefault () ĊĠĠĠĠĠĠĠ Ġval Ġg mt Offset Ġ= Ġtz . get Offset ( date ). to Long () ĊĠĠĠĠĠĠĠ Ġreturn Ġ( date Ġ+ Ġg mt Offset ) Ġ/ ĠDAY _ IN _ M ILL IS ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTo Ġmake Ġit Ġeasy Ġto Ġquery Ġfor Ġthe Ġexact Ġdate , Ġwe Ġnormalize Ġall Ġdates Ġthat Ġgo Ġinto ĊĠĠĠĠ Ġ* Ġthe Ġdatabase Ġto Ġthe Ġstart Ġof Ġthe Ġday Ġin ĠUTC Ġtime . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdate ĠThe ĠUTC Ġdate Ġto Ġnormalize ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe ĠUTC Ġdate Ġat Ġ 1 2 Ġmid night ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnormalize Date ( date : ĠLong ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠNormalize Ġthe Ġstart Ġdate Ġto Ġthe Ġbeginning Ġof Ġthe Ġ( UTC ) Ġday Ġin Ġlocal Ġtime ĊĠĠĠĠĠĠĠ Ġreturn Ġdate Ġ/ ĠDAY _ IN _ M ILL IS Ġ* ĠDAY _ IN _ M ILL IS ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSince Ġall Ġdates Ġfrom Ġthe Ġdatabase Ġare Ġin ĠUTC , Ġwe Ġmust Ġconvert Ġthe Ġgiven Ġdate ĊĠĠĠĠ Ġ* Ġ( in ĠUTC Ġtimezone ) Ġto Ġthe Ġdate Ġin Ġthe Ġlocal Ġtimezone . ĠTh s Ġfunction Ġperforms Ġthat Ġconversion ĊĠĠĠĠ Ġ* Ġusing Ġthe ĠTime Zone Ġoffset . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġut c Date ĠThe ĠUTC Ġdatetime Ġto Ġconvert Ġto Ġa Ġlocal Ġdatetime , Ġin Ġmilliseconds . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġlocal Ġdate Ġ( the ĠUTC Ġdatetime Ġ- Ġthe ĠTime Zone Ġoffset ) Ġin Ġmilliseconds . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget LocalDate From UTC ( utc Date : ĠLong ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtz Ġ= ĠTime Zone . getDefault () ĊĠĠĠĠĠĠĠ Ġval Ġg mt Offset Ġ= Ġtz . get Offset ( utc Date ). to Long () ĊĠĠĠĠĠĠĠ Ġreturn Ġut c Date Ġ- Ġg mt Offset ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSince Ġall Ġdates Ġfrom Ġthe Ġdatabase Ġare Ġin ĠUTC , Ġwe Ġmust Ġconvert Ġthe Ġlocal Ġdate Ġto Ġthe Ġdate Ġin ĊĠĠĠĠ Ġ* ĠUTC Ġtime . ĠThis Ġfunction Ġperforms Ġthat Ġconversion Ġusing Ġthe ĠTime Zone Ġoffset . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlocal Date ĠThe Ġlocal Ġdatetime Ġto Ġconvert Ġto Ġa ĠUTC Ġdatetime , Ġin Ġmilliseconds . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe ĠUTC Ġdate Ġ( the Ġlocal Ġdatetime Ġ+ Ġthe ĠTime Zone Ġoffset ) Ġin Ġmilliseconds . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget UTC Date From Local ( local Date : ĠLong ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtz Ġ= ĠTime Zone . getDefault () ĊĠĠĠĠĠĠĠ Ġval Ġg mt Offset Ġ= Ġtz . get Offset ( local Date ). to Long () ĊĠĠĠĠĠĠĠ Ġreturn Ġlocal Date Ġ+ Ġg mt Offset ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHelper Ġmethod Ġto Ġconvert Ġthe Ġdatabase Ġrepresentation Ġof Ġthe Ġdate Ġinto Ġsomething Ġto Ġdisplay ĊĠĠĠĠ Ġ* Ġto Ġusers . Ġ ĠAs Ġclass y Ġand Ġpol ished Ġa Ġuser Ġexperience Ġas Ġ" 2 0 1 4 0 1 0 2 " Ġis , Ġwe Ġcan Ġdo Ġbetter . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġday Ġstring Ġfor Ġforecast Ġuses Ġthe Ġfollowing Ġlogic : ĊĠĠĠĠ Ġ* ĠFor Ġtoday : Ġ" Today , ĠJune Ġ 8 " ĊĠĠĠĠ Ġ* ĠFor Ġtomorrow : Ġ Ġ" Tom orrow " ĊĠĠĠĠ Ġ* ĠFor Ġthe Ġnext Ġ 5 Ġdays : Ġ" Wednesday " Ġ( just Ġthe Ġday Ġname ) ĊĠĠĠĠ Ġ* ĠFor Ġall Ġdays Ġafter Ġthat : Ġ" Mon , ĠJun Ġ 8 " Ġ( Mon , Ġ 8 ĠJun Ġin ĠUK , Ġfor Ġexample ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcontext ĠĠĠĠĠ ĠContext Ġto Ġuse Ġfor Ġresource Ġlocalization ĊĠĠĠĠ Ġ* Ġ@ param Ġdate In Millis ĠThe Ġdate Ġin Ġmilliseconds Ġ( UTC ) ĊĠĠĠĠ Ġ* Ġ@ param Ġshow Full Date ĠUsed Ġto Ġshow Ġa Ġfull er - version Ġof Ġthe Ġdate , Ġwhich Ġalways Ġcontains Ġeither ĊĠĠĠĠ Ġ* Ġthe Ġday Ġof Ġthe Ġweek , Ġtoday , Ġor Ġtomorrow , Ġin Ġaddition Ġto Ġthe Ġdate . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠA Ġuser - friendly Ġrepresentation Ġof Ġthe Ġdate Ġsuch Ġas Ġ" Today , ĠJune Ġ 8 ", Ġ" Tom orrow ", ĊĠĠĠĠ Ġ* Ġor Ġ" Friday " ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Friendly DateString ( context : ĠContext , Ġdate In Millis : ĠLong , Ġshow Full Date : ĠBoolean ): ĠString Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġlocal Date Ġ= Ġget LocalDate From UTC ( date In Millis ) ĊĠĠĠĠĠĠĠ Ġval Ġday Number Ġ= Ġget Day Number ( local Date ) ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Day Number Ġ= Ġget Day Number ( System . currentTimeMillis ()) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( day Number Ġ== Ġcurrent Day Number Ġ|| Ġshow Full Date ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġthe Ġdate Ġwe 're Ġbuilding Ġthe ĠString Ġfor Ġis Ġtoday 's Ġdate , Ġthe Ġformat ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġis Ġ" Today , ĠJune Ġ 2 4 " ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġday Name Ġ= Ġget Day Name ( context , Ġlocal Date ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreadable Date Ġ= Ġget Readable DateString ( context , Ġlocal Date ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( day Number Ġ- Ġcurrent Day Number Ġ< Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠSince Ġthere Ġis Ġno Ġlocalized Ġformat Ġthat Ġreturns Ġ" Today " Ġor Ġ" Tom orrow " Ġin Ġthe ĠAPI ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġlevels Ġwe Ġhave Ġto Ġsupport , Ġwe Ġtake Ġthe Ġname Ġof Ġthe Ġday Ġ( from ĠSimpleDateFormat ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġand Ġuse Ġit Ġto Ġreplace Ġthe Ġdate Ġfrom ĠDate Utils . ĠThis Ġisn 't Ġguaranteed Ġto Ġwork , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġbut Ġour Ġtesting Ġso Ġfar Ġhas Ġbeen Ġcon clus ively Ġpositive . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠFor Ġinformation Ġon Ġa Ġsimpler ĠAPI Ġto Ġuse Ġ( on ĠAPI Ġ> Ġ 1 8 ), Ġplease Ġcheck Ġout Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġdocumentation Ġon ĠDate Format # get Best DateTime Pattern ( Locale , ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġhttps :// developer . android . com / reference / android / text / format / DateFormat . html # get Best DateTime Pattern ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocalized Day Name Ġ= ĠSimpleDateFormat (" EEEE "). format ( local Date ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreadable Date . replace ( localized Day Name , Ġday Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreadable Date ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( day Number Ġ< Ġcurrent Day Number Ġ+ Ġ 7 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠIf Ġthe Ġinput Ġdate Ġis Ġless Ġthan Ġa Ġweek Ġin Ġthe Ġfuture , Ġjust Ġreturn Ġthe Ġday Ġname . Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Day Name ( context , Ġlocal Date ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflags Ġ= Ġ( Date Utils . FORMAT _ SHOW _ DATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor ĠDate Utils . FORMAT _ NO _ YEAR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor ĠDate Utils . FORMAT _ AB BRE V _ ALL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor ĠDate Utils . FORMAT _ SHOW _ WEEK DAY ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDate Utils . format DateTime ( context , Ġlocal Date , Ġflags ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġdate Ġstring Ġin Ġthe Ġformat Ġspecified , Ġwhich Ġshows Ġa Ġdate , Ġwithout Ġa Ġyear , ĊĠĠĠĠ Ġ* Ġabbre vi ated , Ġshowing Ġthe Ġfull Ġweek day . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcontext ĠĠĠĠĠ ĠUsed Ġby ĠDate Utils Ġto Ġform ate Ġthe Ġdate Ġin Ġthe Ġcurrent Ġlocale ĊĠĠĠĠ Ġ* Ġ@ param Ġtime In Millis ĠTime Ġin Ġmilliseconds Ġsince Ġthe Ġepoch Ġ( local Ġtime ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġformatted Ġdate Ġstring ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Readable DateString ( context : ĠContext , Ġtime In Millis : ĠLong ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġflags Ġ= Ġ( Date Utils . FORMAT _ SHOW _ DATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor ĠDate Utils . FORMAT _ NO _ YEAR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor ĠDate Utils . FORMAT _ SHOW _ WEEK DAY ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠDate Utils . format DateTime ( context , Ġtime In Millis , Ġflags ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġa Ġday , Ġreturns Ġjust Ġthe Ġname Ġto Ġuse Ġfor Ġthat Ġday . ĊĠĠĠĠ Ġ* ĠE . g Ġ" today ", Ġ" tom orrow ", Ġ" Wednesday ". ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcontext ĠĠĠĠĠ ĠContext Ġto Ġuse Ġfor Ġresource Ġlocalization ĊĠĠĠĠ Ġ* Ġ@ param Ġdate In Millis ĠThe Ġdate Ġin Ġmilliseconds Ġ( local Ġtime ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġstring Ġday Ġof Ġthe Ġweek ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Day Name ( context : ĠContext , Ġdate In Millis : ĠLong ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġthe Ġdate Ġis Ġtoday , Ġreturn Ġthe Ġlocalized Ġversion Ġof Ġ" Today " Ġinstead Ġof Ġthe Ġactual ĊĠĠĠĠĠĠĠĠ Ġ* Ġday Ġname . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġday Number Ġ= Ġget Day Number ( date In Millis ) ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Day Number Ġ= Ġget Day Number ( System . currentTimeMillis ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( day Number Ġ== Ġcurrent Day Number ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcontext . getString ( R . string . today ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( day Number Ġ== Ġcurrent Day Number Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcontext . getString ( R . string . tom orrow ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠOtherwise , Ġif Ġthe Ġday Ġis Ġnot Ġtoday , Ġthe Ġformat Ġis Ġjust Ġthe Ġday Ġof Ġthe Ġweek ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ( e . g Ġ" Wednesday ") ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġday Format Ġ= ĠSimpleDateFormat (" EEEE ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġday Format . format ( date In Millis ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }