I woke up this morning (June 7, 2013) thinking it must be about 200 days to Christmas. Foregoing any simple ways to determine that, I decided it would be a good time to use the nscala-time library, a Scala wrapper around Joda Time.
Sticking with the time theme, I haven’t much free time today, so without further ado, here is some Scala code that determines the number of days between today and Christmas:
import com.github.nscala_time.time.Imports._ import org.joda.time.Days // from http://alvinalexander.com object DaysUntilChristmas extends App { // 1: get the current date and time val now = DateTime.now // 2: get a date to represent Christmas val xmas = (new DateTime).withYear(2013) .withMonthOfYear(12) .withDayOfMonth(25) // 3: determine the number of days from now until xmas val daysToXmas = Days.daysBetween(now, xmas).getDays // 4: print the result println(s"daysToXmas = $daysToXmas") // bonus: what day is 200 days from now? val nowPlus200 = now + 200.days println(s"nowPlus200 = $nowPlus200") }
On the morning of June 7, 2013 (in Boulder, Colorado time), the output from this code is:
daysToXmas = 201 nowPlus200 = 2013-12-24T10:29:12.564-07:00
Creating Christmas
If the way I created an instance of Christmas looks a little longer than need be, I did first try to create it like this:
val xmas = new DateTime(2013, 12, 25, 1, 1)
The last two fields of that constructor specify the hour and minute, and when I used that approach, I got one day less than the “fluent” style I showed first. When I changed the hour to something later in the day, such as 12 or 15, etc., I got the same result as the fluent style, so the result depended on the hour I used. Since I wasn’t interested in that level of detail, I went with the fluent style.
A little more information
If you want to have a little more nscala-time fun, add this loop to the bottom of the program:
for (i <- 1 to 203) { val d = now.plusDays(i) println(f"$i%3d: $d") }
On June 6, 2013, that prints results like this:
1: 2013-06-08T10:29:12.564-06:00 2: 2013-06-09T10:29:12.564-06:00 3: 2013-06-10T10:29:12.564-06:00 -- much more here -- 199: 2013-12-23T10:29:12.564-07:00 200: 2013-12-24T10:29:12.564-07:00 201: 2013-12-25T10:29:12.564-07:00
No matter how you count it, 201 does seem to be the correct result.
Using nscala-time with Scala and SBT
To use the nscala-time library with a Scala SBT project, just add this line to your SBT build.sbt file:
libraryDependencies += "com.github.nscala-time" %% "nscala-time" % "0.4.2"
With that line, you should be able to copy and paste the source code above into an SBT project, and run it like this:
$ sbt run
If you needed a Scala + nscala-time example, I hope this has been helpful.