Calculate the time gap between two scheduled events.

← Operators and Expressions · Ref: Q1202

EK9 Date supports operator - with another Date, returning a Duration. Use Duration comparison to check if the gap meets a threshold.

DATE SUBTRACTION

  gap <- eventB.eventDate - eventA.eventDate   returns Duration

DURATION COMPARISON

  threshold <- P30D
  if gap > threshold
    stdout.println("Events are more than 30 days apart")

Component access on Duration:

  gap.days()    number of days
  gap.months()  number of months

See Q1174 for duration between dates. See Q1188 for duration operations. See Q1186 for date comparison.

Example

defines module qa.operators.durationbetweenevents

  defines record

    ScheduledEvent
      eventName as String: String()
      eventDate as Date: Date()

      ScheduledEvent() as pure
        ->
          theName as String
          theDate as Date
        this.eventName :=: theName
        this.eventDate :=: theDate

      default operator

  defines program

    DurationBetweenEventsDemo()
      stdout <- Stdout()

      // === CREATE EVENTS ===

      launch <- ScheduledEvent("Product Launch", 2024-01-15)
      milestone <- ScheduledEvent("Q2 Milestone", 2024-06-30)
      review <- ScheduledEvent("Annual Review", 2024-12-31)

      // === CALCULATE GAPS ===

      launchToMilestone <- milestone.eventDate - launch.eventDate
      stdout.println(`Launch to Milestone: ${launchToMilestone}`)
      stdout.println(`Days: ${launchToMilestone.days()}`)

      milestoneToReview <- review.eventDate - milestone.eventDate
      stdout.println(`Milestone to Review: ${milestoneToReview}`)

      // === COMPARE DURATIONS ===

      if launchToMilestone < milestoneToReview
        stdout.println("First half is shorter than second half")

      // === CHECK AGAINST THRESHOLD ===

      threshold <- P90D
      if launchToMilestone > threshold
        stdout.println(`Launch to milestone exceeds ${threshold}`)

      // === TOTAL SPAN ===

      totalSpan <- review.eventDate - launch.eventDate
      stdout.println(`Total span: ${totalSpan}`)

Common mistakes

E50060 — EK9 Date has no between() method (and no ChronoUnit) — subtract two Dates with the - operator to get a Duration. See ek9 -h E50060 for details.

Incorrect:

      stdout.println(`Launch to milestone exceeds ${launch.eventDate.between(review.eventDate)}`)

Correct:

      stdout.println(`Launch to milestone exceeds ${threshold}`)
Other ways to ask this
  • Subtract two dates to find the duration between events.
  • I need to compute how long between a project start and its milestone.
  • In Java I'd use ChronoUnit.DAYS.between(). What is the EK9 equivalent?
  • Given two event dates, find the duration gap and compare it to a threshold.

Coming from another language?

Java: ChronoUnit.DAYS.between(d1, d2) or Period.between(). Python: (d2 - d1).days. Rust: d2.signed_duration_since(d1). Go: t2.Sub(t1). EK9: eventB.eventDate - eventA.eventDate gives Duration directly, then compare with < > operators.

Keywords: threshold, schedule, events, duration, days, gap, between, subtract, compare, date