Working with dates in Argo Workflows can range from simple to unexpectedly challenging depending on your needs. Whether you're scheduling tasks, extracting specific parts of a date, or looping through hours for complex workflows there’s plenty you can achieve—but figuring it out might take some trial and error. In this post I’ll share practical tips and examples to help you navigate date handling more easily.
If you’re just starting with Argo Workflows I’ve written a guide to setting up workflows locally. Feel free to check it out—it’s a great place to start before diving into date operations. (For reference, I’m using Argo Workflows v3.5.11 in this post.)
Using workflow.creationTimestamp
Argo provides a built-in variable {{workflow.creationTimestamp}}
which gives you the exact time when the workflow was created. This variable is extremely useful for creating timestamps or formatting dates.
- name: current-date value: '{{workflow.creationTimestamp}}'
Example: Breaking It Down
Want to extract just the parts of the date? No problem:
- name: year value: '{{workflow.creationTimestamp.Y}}' - name: month value: '{{workflow.creationTimestamp.m}}' - name: day value: '{{workflow.creationTimestamp.d}}' - name: hour value: '{{workflow.creationTimestamp.H}}' - name: minute value: '{{workflow.creationTimestamp.M}}' - name: second value: '{{workflow.creationTimestamp.S}}'
Adding Magic with the Sprig Library
If workflow.creationTimestamp
helps you get started, the Sprig library helps you do more with dates like formatting them or calculating new ones. Let’s look at how you can format workflow.creationTimestamp
using Sprig.
Example: Formatting the Creation Timestamp
Suppose you want to turn workflow.creationTimestamp
into a simpler format like YYYY-MM-DD
. The Sprig library makes this straightforward:
- name: creation-timestamp-formatted value: '{{=sprig.date("2006-01-02", workflow.creationTimestamp)}}'
Note : The Sprig library uses Go’s date formatting style, where a specific reference date (
Mon Jan 2 15:04:05 MST 2006
) serves as the template. For example:
-
2006
represents the year. -
01
represents the month. -
02
represents the day. -
15:04
represents hours and minutes in 24-hour time.
If you need additional formatting (e.g., including time), you can adjust the format string accordingly:
-
2006-01-02 15:04:05
→2025-01-02 14:35:00
Example: Getting Yesterday's Date
Need to backtrack a bit? Here’s how to get yesterday’s date:
- name: yesterday value: '{{=sprig.date("2006-01-02", sprig.dateModify("-24h", sprig.now()))}}'
What’s happening here?
-
2006-01-02
is Sprig’s standard date format. (It’s a bit quirky, but you’ll get used to it!) -
-24h
shifts the date back by 24 hours.
Example: Extracting Date Parts from Modified Dates
What if you want the year of yesterday’s date? Or the month? No problem:
- name: year value: '{{=sprig.date("2006", sprig.dateModify("-24h", sprig.now()))}}' - name: month value: '{{=sprig.date("01", sprig.dateModify("-24h", sprig.now()))}}' - name: day value: '{{=sprig.date("02", sprig.dateModify("-24h", sprig.now()))}}'
Example: Converting Dates to Epoch Time
Need to work with epoch time? Sprig has you covered:
- name: parsedEpoch value: "{{=sprig.unixEpoch(sprig.toDate('2006-01-02T15:04:05 MST', inputs.parameters.inputDate))}}" - name: nowEpoch value: "{{=sprig.unixEpoch(sprig.now())}}"
A Sample Workflow for Date Handling
To bring it all together, here’s a sample workflow that demonstrates how to extract and manipulate various parts of a date.
apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: name: date-example spec: entrypoint: main arguments: parameters: - name: creation-timestamp value: '{{workflow.creationTimestamp}}' - name: today-year value: '{{workflow.creationTimestamp.Y}}' - name: today-month value: '{{workflow.creationTimestamp.m}}' - name: today-day value: '{{workflow.creationTimestamp.d}}' - name: creation-timestamp-formatted value: '{{=sprig.date("2006-01-02", workflow.creationTimestamp)}}' - name: yesterday value: '{{=sprig.date("2006-01-02", sprig.dateModify("-24h", sprig.now()))}}' - name: year value: '{{=sprig.date("2006", sprig.dateModify("-24h", sprig.now()))}}' - name: month value: '{{=sprig.date("01", sprig.dateModify("-24h", sprig.now()))}}' - name: day value: '{{=sprig.date("02", sprig.dateModify("-24h", sprig.now()))}}' - name: now-epoch value: "{{=sprig.unixEpoch(sprig.now())}}" templates: - name: main inputs: parameters: - name: creation-timestamp - name: today-year - name: today-month - name: today-day - name: creation-timestamp-formatted - name: yesterday - name: year - name: month - name: day - name: now-epoch container: image: busybox command: [sh, -c] args: - | echo "Today's date: {{inputs.parameters.creation-timestamp}}"; echo "Today's year: {{inputs.parameters.today-year}}"; echo "Today's month: {{inputs.parameters.today-month}}"; echo "Today's day: {{inputs.parameters.today-day}}"; echo "Today's date formatted: {{inputs.parameters.creation-timestamp-formatted}}"; echo "Yesterday's date: {{inputs.parameters.yesterday}}"; echo "Year: {{inputs.parameters.year}}"; echo "Month: {{inputs.parameters.month}}"; echo "Day: {{inputs.parameters.day}}"; echo "Now-epoch: {{inputs.parameters.now-epoch}}";
And what it prints:
Looping Through Hours (Because Why Not?)
Sometimes you need to iterate through all the hours of the day—whether it’s for hourly jobs or logging. Argo’s withSequence
makes this painless:
apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: generateName: loop-hours-example- spec: entrypoint: main templates: - name: main steps: - - name: hour-loop template: print-hour arguments: parameters: - name: hour value: "{{item}}" withSequence: count: 24 start: 0 format: "%02d" - name: print-hour inputs: parameters: - name: hour container: image: busybox command: [sh, -c] args: - | echo "Processing hour: {{inputs.parameters.hour}}";
Here’s what’s happening:
-
withSequence
generates a sequence from00
to23
. - Each hour is passed to the
hour
parameter and printed.
Wrapping Up
That’s it! Hope this helps you handle dates in your Argo Workflows more smoothly. Let me know if you try it out or if you have your own tricks to share! 😊
Top comments (0)