Cron4s Change Log


Bug fixes

  • #335: Fix exception thrown when parsing an incomplete expression.

Version upgrades:

  • Scala 2.12.12 / Scala 2.13.2
  • ScalaJS 0.6.33
  • Cats 2.1.1
  • Decline 1.2.0
  • Circe 0.13.0
  • Doobie 0.9.0
  • JodaTime 2.10.6
  • ScalaJS MomentJS 0.10.4 / MomentJS 0.5.28
  • Scala Java Time 2.0.0


New Features:

  • #142: Add support for Scala 2.13 (and drop support for Scala 2.11)
  • #142: Remove compile-time expressions (to be considered later if contextual support for 2.13 improves)
  • #149: Add extension module for doobie. Find documentation about it in the doobie extension docs.
  • #138: Rewrite parser using Scala Parser Combinators instead of FastParse.

Version upgrades:

  • Scala 2.12.9 / Scala 2.13.0
  • ScalaJS 0.6.29
  • Cats 2.0.0
  • Decline 1.0.0
  • Circe 0.12.1
  • ScalaJS MomentJS 0.10.0 / MomentJS 0.5.25
  • Scala Java Time 2.0.0-RC3


This version adds some features and upgrades some of the core dependencies. This version is not binary compatible with the 0.4.x series.

Bug Fixes:

  • Fixed a parser inconsistency error in which the string representation of a given cron AST could be parsed into a different (although equivalent) one. This was fixed as part of the work for #127.

New features:

  • #125: Add extension module for decline. Find documentation about it in the extensions docs.
  • #127: Add extension module for circe. Find documentation about it in the extensions docs.
  • #126: Add a compile-time string interpolator.

Version upgrades:

  • Scala 2.11.12 / Scala 2.12.8
  • ScalaJS 0.6.26
  • Cats 1.6.0
  • Scala Java Time 2.0.0-RC1


This is a maintenance release over 0.4.3:


  • #94: The signature for the get method in the IsDateTime typeclass has been changed to capture errors when getting the value of a given field.

Version upgrades:

  • Scala 2.11.12 / Scala 2.12.4
  • ScalaJS 0.6.21
  • Cats 1.0.1


This is a maintenance release over 0.4.2:

Version upgrades:

  • Scala 2.11.11 / Scala 2.12.4
  • ScalaJS 0.6.20
  • Cats 1.0.0-RC1
  • FastParse 1.0.0


This a maintenance release over 0.4.1:

Version Upgrades:

  • Scala 2.11.11 / Scala 2.12.3
  • ScalaJS 0.6.19
  • Cats 1.0.0-MF
  • FastParse 0.4.4


This is a bug fix release over 0.4.0:

Bug Fixes:

  • #73/#80: Rolling an update to the day of month field could cause setting an invalid date, which will eventually return a None result from the next/prev methods. This case is now handled and will propagate a carry over value to the month field whenever it happens.


  • #81: The signature for the set method in the IsDateTime typeclass has been changed to capture errors when setting the values.
  • #78: Upgrading the Scala version to 2.12.2 means that case classes do not support anymore having implicit parameter lists. This means that all node class implementations under package cron4s.expr have been rewritten using normal Scala classes instead of case classes. This means that they can not be used anymore in pattern matching and that binary compatibility in their case has been broken.

Version Upgrades:

  • Scala: 2.11.11 / 2.12.2
  • ScalaJS: 0.6.18
  • Scala Java Time: 2.0.0-M12

Please, check migration document for instructions on how to migrate your code to the last version: Migration to 0.4.1


This the 4th release of Cron4s, aimed at a more complete implementation of the CRON Spec, easier (if possible) to use, and with important bug fixes.


  • #58: CRON expressions now support ? symbols in both day of month and day of week fields. This also means that now expressions must use that symbol in one of those two fields to be valid.
  • Additional parse operations where added to the Cron entry point: parse, tryParse and unsafeParse. Good-old Cron("...") syntax is still supported and it be the preferred one as it’s the most concise one.
  • #70: Improved parser error messages.
  • #60: ScalaJS & ScalaJVM support for JSR-310 (aka Java 8 Time) has been unified in the cron4s.lib.javatime package.
  • #67: Added module with support for MomentJS.
  • #66: Cron entry point is exported as a CommonJS module in ScalaJS.

Bug Fixes:

  • #59: Carry over from fields month and day of week wasn’t properly applied to the datetime.
  • #56: The effect of updating a date-time field propagates the effect to the predecessor fields, no matter the direction of this effect (forward or backwards in time).


  • #63: Scalaz has been replaced by Cats.
  • #67: Joda Time support has been moved to it’s own module.
  • #61: Field expression selection by field type is now fully type-checked during compilation.

Version Upgrades:

  • ScalaJS: 0.6.15
  • Cats: 0.9.0
  • Scala Java Time: 2.0.0-M10

Please, check migration document for instructions on how to migrate your code to the last version: Migration to 0.4.0


cron4s 0.3.1 is an incremental update with the following changes:

  • #39: Fixed type signature in summon method for type class DateTimeCron
  • #41: Support for Joda’s partial date times: LocalDate, LocalTime, LocalDateTime
  • #45: Do no reference tests modules in parent POM as a compile dependency
  • #52: Preserve step inertia when calculating a next or previous date, initially reported as in #50
  • #51: Reset milliseconds in DateTime return values


cron4s 0.3.0 has an overhaul of its internals from 0.2.1. This release is not source compatible with previous ones as it has several API breaking changes which will make users have to update their codebases to be able to compile with it. The list of changes in this release are:

  • Updated ScalaJS to 0.6.14
  • Support for Scala 2.12 (#22)
  • Re-organized the built-in datetime library support under the cron4s.lib package.
  • cron4s.expr.AnyExpr has been renamed to cron4s.expr.EachNode to properly reflect the semantics of the * symbol in CRON expressions. (#22)
  • Parser implementation has been rewritten using FastParse (#22)
  • Full type signatures in the AST are now preserved after parsing the expression (#24)
  • The parsed expression AST is not fully validated and any error will result returning those errors instead of the actual expression object.
  • Fixed inconsistencies when stepping over enumerated values of the different expression ranges (#28)
  • All expression and nodes now implement the scalaz.Show typeclass to consistently return the actual CRON string representation.
  • Common datetime operations (matching and stepping) are now supported in subexpressions (date or time only)
  • Providing support for custom date time libraries has been greatly simplified and full documented (#37)

A migration guide has been published for anyone that would like to update.


cron4s 0.2.1 is a maintenance release over 0.2.0. The list of changes in this release are:

  • Documentation has been improved published as a microsite
  • timePart and datePart fields in CronExpr expose field based accessors.
  • repr accessor in CronExpr is now private


cron4s 0.2.0 is an API improvement release over the previous 0.1.0. The list of changes in this release are:

  • Deeper Typeclass based design which has helped to make a more concise and uniform implementation.
  • Added a Seconds field to the cron expression and parser.
  • Added a human-friendly toString implementation to all the expressions and cron units.
  • Dropped support for java.util.Calendar as it is impossible to treat it as an immutable type and yields weird results.
  • Improved parser error messages, including the position at which the parser stopped.
  • Made CronExpr a proper case class with its own attributes to ease using it with serializers. Access to the HList is still granted with the same attribute names.
  • Deprecated the cron4s.matcher.Matcher and replaced it by cron4s.types.Predicate
  • Added a testkit module, used to test the library and useful to test user extensions.


cron4s 0.1.0 is a preview release of a fully Scala idiomatic CRON expression parser that can be used in the JVM or in ScalaJS. cron4s has been designed with extensibility in mind, meaning that it’s not tied to an specific date-time library/implementation, but provides support for many instead.


import cron4s._
import java.time._
import cron4s.japi.time._

val Right(cron) = Cron("10-35 2,4,6 * * *")
val now =
val nextDate =