Another good link: Baysick: A Scala DSL Implementing BASIC
package kebra import java.util.Calendar import java.text.SimpleDateFormat import java.text.ParsePosition class DateDSL(val cal: Calendar) { cal.clear(Calendar.HOUR) import DateDSL.Conjunction def this(d: DateDSL) = this(d.cal) private var last = 0; def plus(num: Int) = { last = num; this } def minus(num: Int) = { last = -num; this } def +(num: Int) = plus(num) def -(num: Int) = minus(num) def months = { cal.add(Calendar.MONTH, last); this } def months(and: Conjunction): DateDSL = months def month = months def month(and: Conjunction): DateDSL = months def years = { cal.add(Calendar.YEAR, last); this } def years(and: Conjunction): DateDSL = years def year = years def year(and: Conjunction): DateDSL = years def days = { cal.add(Calendar.DAY_OF_MONTH, last); this } def days(and: Conjunction): DateDSL = days def day = days def day(and: Conjunction): DateDSL = days def is(then: Calendar) = { cal.setTimeInMillis(then.getTimeInMillis) cal.clear(Calendar.HOUR) this } def is(then: String) = { val cthen = ParseDate(then,"MM/dd/yyyy") cal.setTimeInMillis(cthen.getTimeInMillis) cal.clear(Calendar.HOUR) this } def ParseDate(s_date: String, s_format: String): Calendar = { var cal = Calendar.getInstance() cal.setTime(new SimpleDateFormat(s_format).parse(s_date, new ParsePosition(0))) cal } def before(d: DateDSL): Boolean = cal.before(d.cal) def after(d: DateDSL): Boolean = cal.after(d.cal) override def toString = new String(new SimpleDateFormat("ddMMMyy").format(cal.getTime())) } object DateDSL { class Conjunction val and = new Conjunction def Today = new DateDSL(Calendar.getInstance) def Tomorrow = Today + 1 day def Yesterday = Today - 1 day def today = Today def tomorrow = Tomorrow def yesterday = Yesterday def Now = Today def now = Today }I also added a testcase below:
package kebra import java.util.Calendar import java.text.SimpleDateFormat import kebra.DateDSL._ object TestKebra extends App { println("Hello World!") println(Tomorrow minus 1 month and plus 10 years and plus 1 day) println(Today + 2 months and plus 9 years and minus 1 day) println(Today - 9 years and minus 1 day) println(((Today + 2 months and) + 9 years and) - 1 day) println(now is "10/1/2011" plus 3 days) println("\n"+printZisday((now is "10/1/2011" plus 3 days).cal,"ddMMMyy")) assert(printZisday((now is "10/1/2011" plus 3 days).cal,"MM/dd/yyyy").indexOf("10/04/2011")==0) assert((now is "10/1/2011" plus 3 days).before(now is "10/1/2011" plus 4 days)) assert((now is "10/1/2011" plus 4 days).after(now is "10/2/2011" plus 2 days)) val zendDate = new DateDSL(now is "2/2/2011") var ago = new DateDSL(now is "2/2/2011" minus (9*7) days) println("***** ago: "+ago+", zendDate: "+zendDate) while(ago.before(zendDate)) { println(" ago: "+ago) ago plus 7 days } println("***** ago: "+ago+", zendDate: "+zendDate) assert((ago plus 1 day).after(zendDate)) println("***** ago: "+ago+", zendDate: "+zendDate) assert((ago minus 2 days).before(zendDate)) println("***** ago: "+ago+", zendDate: "+zendDate) def printZisday(zisday: Calendar, fmt: String): String = new String(new SimpleDateFormat(fmt).format(zisday.getTime())) }