Get the difference between two dates (Updated 2025)

Many Power Automate users encounter issues with the dateDifference() function when calculating the difference between two dates. The problem arises when the output format varies depending on the duration, causing errors in extracting Days, Hours, Minutes, and Seconds.

This example builds a Days, Hours, Minutes, and Seconds object from a dateDifference() result. If you need the basics first, see dateDifference syntax and its time-span result. Check the input assumptions below before reusing the expression.

The Flow

  1. Compose action: named StartDate = 2024-12-10T15:58:28
  2. Compose action: named EndDate = 2024-12-10T19:22:20
  3. Compose action: uses dateDifference() expression. see below

Below is the expression used in the Date Difference Compose action. It distinguishes formats by checking for a period, so do not treat it as a parser for every possible result. Fractional-second and negative-duration inputs need separate validation before this example is used for them.

Use dates with an understood time zone and decide how your workflow should handle an end time earlier than its start time. Microsoft’s function reference documents a negative result in that case. This timezone walkthrough explains the related conversion task.

dateDifference expression

Create a compose action for StartDate and EndDate

if(
contains(
dateDifference(outputs('StartDate'), outputs('EndDate')),
'.'
),
json(
concat(
'{"Days":', string(int(split(dateDifference(outputs('StartDate'), outputs('EndDate')), '.')[0])),
',"Hours":', string(int(split(split(dateDifference(outputs('StartDate'), outputs('EndDate')), '.')[1], ':')[0])),
',"Minutes":', string(int(split(split(dateDifference(outputs('StartDate'), outputs('EndDate')), '.')[1], ':')[1])),
',"Seconds":', string(int(split(split(dateDifference(outputs('StartDate'), outputs('EndDate')), '.')[1], ':')[2])),
'}'
)
),
json(
concat(
'{"Days":0',
',"Hours":', string(int(split(dateDifference(outputs('StartDate'), outputs('EndDate')), ':')[0])),
',"Minutes":', string(int(split(dateDifference(outputs('StartDate'), outputs('EndDate')), ':')[1])),
',"Seconds":', string(int(split(dateDifference(outputs('StartDate'), outputs('EndDate')), ':')[2])),
'}'
)
)
)

How it works

  • The if() function checks if the dateDifference() result contains a . (dot).
  • If it does, it means the result has a days component (e.g., 1268.04:15:30), so we parse out Days, Hours, Minutes, and Seconds accordingly.
  • The no-period branch is intended for a result such as 12:57:47. A result containing fractional seconds, such as 12:57:47.2544602, does contain a period and will enter the other branch. The current example must not be described as handling that input correctly without further changes and testing.

Result:

This will produce a JSON object like:
{
"Days": 1268,
"Hours": 4,
"Minutes": 15,
"Seconds": 30
}

Or
{
"Days": 0,
"Hours": 12,
"Minutes": 57,
"Seconds": 47
}

Steps to Access Each Value

If you use the fixed expression directly in a Compose action (e.g., named Date_Difference), you can reference the fields like this:

  • Days: outputs('Date_Difference')?['Days']
  • Hours: outputs('Date_Difference')?['Hours']
  • Minutes: outputs('Date_Difference')?['Minutes']
  • Seconds: outputs('Date_Difference')?['Seconds']

Use these expressions in subsequent actions (like another Compose, a Condition, or Apply to Each) to reference the specific values.

Download my Flow

You can easily copy and paste actions in Power Automate. Allowing you to copy and paste my example.

  1. Classic designer
  2. New designer

Classic designer

Step 1: Copy the code snippet

{"id":"b6b531e2-b7b5-4a9e-86bd-7e2a069529a0","brandColor":"#8C3900","connectionReferences":{},"connectorDisplayName":"Control","icon":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDMyIDMyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPg0KIDxwYXRoIGQ9Im0wIDBoMzJ2MzJoLTMyeiIgZmlsbD0iIzhDMzkwMCIvPg0KIDxwYXRoIGQ9Im04IDEwaDE2djEyaC0xNnptMTUgMTF2LTEwaC0xNHYxMHptLTItOHY2aC0xMHYtNnptLTEgNXYtNGgtOHY0eiIgZmlsbD0iI2ZmZiIvPg0KPC9zdmc+DQo=","isTrigger":false,"operationName":"Get_date_difference_object","operationDefinition":{"type":"Scope","actions":{"StartDate":{"type":"Compose","inputs":"2024-12-10T15:58:28","runAfter":{}},"EndDate":{"type":"Compose","inputs":"2024-12-10T19:22:20","runAfter":{"StartDate":["Succeeded"]}},"Date_Difference":{"type":"Compose","inputs":"@if(\r\n contains(\r\n dateDifference(outputs('StartDate'), outputs('EndDate')), \r\n '.'\r\n ),\r\n json(\r\n concat(\r\n '{\"Days\":', string(int(split(dateDifference(outputs('StartDate'), outputs('EndDate')), '.')[0])),\r\n ',\"Hours\":', string(int(split(split(dateDifference(outputs('StartDate'), outputs('EndDate')), '.')[1], ':')[0])),\r\n ',\"Minutes\":', string(int(split(split(dateDifference(outputs('StartDate'), outputs('EndDate')), '.')[1], ':')[1])),\r\n ',\"Seconds\":', string(int(split(split(dateDifference(outputs('StartDate'), outputs('EndDate')), '.')[1], ':')[2])),\r\n '}'\r\n )\r\n ),\r\n json(\r\n concat(\r\n '{\"Days\":0',\r\n ',\"Hours\":', string(int(split(dateDifference(outputs('StartDate'), outputs('EndDate')), ':')[0])),\r\n ',\"Minutes\":', string(int(split(dateDifference(outputs('StartDate'), outputs('EndDate')), ':')[1])),\r\n ',\"Seconds\":', string(int(split(dateDifference(outputs('StartDate'), outputs('EndDate')), ':')[2])),\r\n '}'\r\n )\r\n )\r\n)","runAfter":{"EndDate":["Succeeded"]},"metadata":{"operationMetadataId":"03c8d578-576a-41a3-8d63-609a15ce594b"}}},"runAfter":{"Add_to_time":["Succeeded"]}}}

Step 2: In Power Automate when adding a new action click My clipboard .

Step 3: Ctrl + V


New designer

Step 1: Copy the code snippet

{"nodeId":"Get_date_difference_object-copy","serializedOperation":{"type":"Scope","actions":{"StartDate":{"type":"Compose","inputs":"2024-12-10T15:58:28"},"EndDate":{"type":"Compose","inputs":"2024-12-10T19:22:20","runAfter":{"StartDate":["Succeeded"]}},"Date_Difference":{"type":"Compose","inputs":"@if(\r\n contains(\r\n dateDifference(outputs('StartDate'), outputs('EndDate')), \r\n '.'\r\n ),\r\n json(\r\n concat(\r\n '{\"Days\":', string(int(split(dateDifference(outputs('StartDate'), outputs('EndDate')), '.')[0])),\r\n ',\"Hours\":', string(int(split(split(dateDifference(outputs('StartDate'), outputs('EndDate')), '.')[1], ':')[0])),\r\n ',\"Minutes\":', string(int(split(split(dateDifference(outputs('StartDate'), outputs('EndDate')), '.')[1], ':')[1])),\r\n ',\"Seconds\":', string(int(split(split(dateDifference(outputs('StartDate'), outputs('EndDate')), '.')[1], ':')[2])),\r\n '}'\r\n )\r\n ),\r\n json(\r\n concat(\r\n '{\"Days\":0',\r\n ',\"Hours\":', string(int(split(dateDifference(outputs('StartDate'), outputs('EndDate')), ':')[0])),\r\n ',\"Minutes\":', string(int(split(dateDifference(outputs('StartDate'), outputs('EndDate')), ':')[1])),\r\n ',\"Seconds\":', string(int(split(dateDifference(outputs('StartDate'), outputs('EndDate')), ':')[2])),\r\n '}'\r\n )\r\n )\r\n)","runAfter":{"EndDate":["Succeeded"]},"metadata":{"operationMetadataId":"03c8d578-576a-41a3-8d63-609a15ce594b"}}},"runAfter":{"Add_to_time":["Succeeded"]}},"allConnectionData":{},"staticResults":{},"isScopeNode":true,"mslaNode":true}

Step 2: In Power Automate click the + to add an action. Click Paste an action

Conclusion

That’s it! pretty easy right? if you encounter any issues, comment below!

Browse all articles

Comments

2 responses to “Get the difference between two dates (Updated 2025)”

  1. cweinholdt Avatar
    cweinholdt

    Hi Joash,

    Thank you for your solution 🙂
    However, how do you handle cases where the time difference is negative because “Start” occurs before “End”?

    In my scenario, I don’t know in advance which time value corresponds to “Start” or “End.”

    Looking forward to your input. 🙂

  2. […] for every possible time span. For a separate example that builds an object from the duration, see extracting date-difference components, including its scope note before you reuse the […]

Leave a Reply

Discover more from Flow Alt Delete

Subscribe now to keep reading and get access to the full archive.

Continue reading