A project team I worked with built a flow that sent meeting details from a SharePoint list to a scheduling API. The flow ran, but the API rejected every request with a date format error. The dates looked fine in SharePoint; the API simply wanted them in ISO 8601, the international standard format, and it wanted them in UTC.
Most date problems in Power Automate come down to the same two questions: what format does the next system expect, and which time zone is the value in? In this tutorial, I’ll answer both for the three situations I see most: a SharePoint date, separate date and time columns in Excel, and a date and time someone types in when running a flow.
Quick answer: Use formatDateTime(value, 'yyyy-MM-ddTHH:mm:ssZ') for an ISO 8601 date in UTC, or simply formatDateTime(value, 'o'), the default ISO format. SharePoint dates reach your flow in UTC already. To combine a local date and time, such as Excel columns or manual input, build the text with concat() and convert it with convertToUtc(..., 'Eastern Standard Time'). Use parseDateTime() for day-first dates such as 28/09/2026.
What ISO 8601 looks like
An ISO 8601 timestamp looks like this:
2026-04-25T07:00:00Z
It has the date as year-month-day, a T between the date and the time, the time in 24-hour format, and a Z at the end, which means the time is in UTC. Instead of Z, some systems use an offset such as -04:00 for Eastern Daylight Time.
Power Automate works in UTC. Values from SharePoint, utcNow() and most connectors arrive as UTC, and formatDateTime() without a format returns the full ISO format, such as 2026-04-25T07:00:00.0000000Z. Most APIs, Dataverse and SharePoint filter queries accept that.
Formats at a glance
| Format string | Result | Use it for |
|---|---|---|
'o' (the default) | 2026-04-25T07:00:00.0000000Z | Full precision, any system that reads ISO 8601 |
'yyyy-MM-ddTHH:mm:ssZ' | 2026-04-25T07:00:00Z | APIs that want seconds but no fractions |
's' | 2026-04-25T07:00:00 | Systems that want no time zone marker |
'yyyy-MM-dd' | 2026-04-25 | Date-only fields and filter queries |
One caution: in a custom format, the Z is just a letter that gets printed. It doesn’t convert anything. 'yyyy-MM-ddTHH:mm:ssZ' is correct only when the value is already in UTC, which SharePoint and utcNow() values are.
Scenario 1: Format a SharePoint date as ISO 8601
The list, Meetings, has a Title column and a Meeting Date (Date and Time) column:

Step 1: Create the flow
Create an automated cloud flow with the SharePoint trigger When an item is created, and choose your site and the Meetings list:

Step 2: Format the date in a Compose action
Add a Compose action, select fx in the Inputs field, and enter:
formatDateTime(triggerOutputs()?['body/MeetingDate'], 'yyyy-MM-ddTHH:mm:ssZ')

Column names with spaces have different internal names (a space often becomes _x0020_), so insert the date from the dynamic content inside the expression rather than typing the column name.
Step 3: Test it
Add an item to the list and open the Compose action in the run history:

The meeting was entered as midnight on April 25, 2026, and the output reads 2026-04-25T07:00:00Z. That’s correct: the site uses Pacific Time, and midnight Pacific Daylight Time is 7:00 AM UTC. The value is ready for an API, a Dataverse column or another list.
Scenario 2: Combine Excel date and time columns into ISO 8601
This one needs more care, because the date and the time are in separate columns. The table, EventSchedule, has Event Name, Event Date, Event Time and an empty Event Date in ISO Format column for the result:

The data must be formatted as an Excel table (select it and choose Format as Table), because the Excel connector only reads tables.
Step 1: Read the rows as ISO dates
Create an instant cloud flow and add List rows present in a table. Choose the location, library, file and table. Under the advanced parameters, set DateTime Format to ISO 8601:

Without that setting, dates arrive as Excel’s internal serial numbers, such as 46137, which are hard to work with. Also note the connector returns 256 rows by default; turn on pagination for bigger tables.
Step 2: Combine the date and the time
Inside the loop over the rows, add two Compose actions, one with the Event Date and one with the Event Time, so the expression stays readable. The time column comes back with a placeholder date (often from 1899), which is why you take only its time part.
Excel times are usually local wall-clock times. For events in Eastern Time, add a third Compose that joins the two parts and converts them to UTC:
convertToUtc(
concat(
formatDateTime(outputs('Event_date_from_excel'), 'yyyy-MM-dd'),
'T',
formatDateTime(outputs('Event_time_from_excel'), 'HH:mm:ss')
),
'Eastern Standard Time'
)

For an event on April 10, 2026, at 10:00 AM Eastern, the result is 2026-04-10T14:00:00.0000000Z. The screenshot shows an earlier version that simply added Z to the local time; that labels 10:00 AM Eastern as 10:00 AM UTC, which is four hours off. Use convertToUtc() with your own time zone, and use the names of your own Compose actions in the expression.
Step 3: Write the result back to Excel
Add Update a row with the same file and table. Set Key Column to Event Name, Key Value to the Event Name from the loop, and Event Date in ISO Format to the output of the combining Compose:

Update a row changes the first row that matches the key, so use a key column with unique values.
Scenario 3: Turn a typed-in date and time into ISO 8601
For instant flows, you might ask the person running the flow for a date and a time. Add two inputs to the Manually trigger a flow trigger: a Date input and a Text input for the time, because there’s no time-only input type. Ask people to type the time in 24-hour format, such as 14:30.
Then add a Compose with:
convertToUtc(
concat(triggerBody()?['date'], 'T', triggerBody()?['text']),
'Eastern Standard Time'
)

For a date of June 22, 2026, and a time of 14:30 Eastern, the output is 2026-06-22T18:30:00.0000000Z.
Show a UTC date in a US time zone
Going the other way is just as common: SharePoint gives you UTC, but your email should show local time. Use convertTimeZone(), with UTC as the source:
convertTimeZone(triggerOutputs()?['body/MeetingDate'], 'UTC', 'Eastern Standard Time', 'MMMM d, yyyy h:mm tt')
The time zone names are the Windows names, such as ‘Eastern Standard Time’, ‘Central Standard Time’, ‘Mountain Standard Time’ and ‘Pacific Standard Time’, and they handle daylight saving time for you. The built-in Convert time zone action does the same with fields for the base time, source and destination zones, and an optional format.
Avoid typing a fixed offset such as -05:00 into a format string. It doesn’t convert the time, and US offsets change twice a year with daylight saving time, so a hardcoded offset is wrong for half the year.
Common errors
“The date time string must match ISO8601 format”
The value you passed isn’t a date Power Automate can read. US-style text such as 09/28/2026 works, but day-first text such as 28/09/2026 doesn’t, because 28 isn’t a month. Use parseDateTime() with the right locale or format instead of rebuilding the text by hand:
parseDateTime('28/09/2026', 'en-GB')
You can also give an exact format, as in parseDateTime('28092026', 'en-US', 'ddMMyyyy').
A blank date breaks the flow
An optional date that’s empty makes formatDateTime() fail. Check for it first:
if(empty(triggerBody()?['date']), '', formatDateTime(triggerBody()?['date'], 'yyyy-MM-dd'))
The time is a few hours off
Either a local time was labeled as UTC (the Z problem above), or a UTC time was shown without converting it. Decide which zone each value is in, and convert with convertToUtc() or convertTimeZone().
For filtering SharePoint lists by date, see Power Automate Get items filter query on dates.
These guides cover more date handling in Power Automate:
- Power Automate Get Items Filter Query Date [With Examples]
- Power Automate dayOfWeek() Function [With Examples]
- Power Automate: How to Check If a Date Is Blank (4 Methods)
- How to Initialize a Date Variable in Power Automate?
- Convert String to Date in Power Automate [3 Methods + Error Fixes]
- How to Convert UTC to Local Time Zone in Power Automate? [3 Various Ways]
Frequently Asked Questions
What date format does Power Automate use by default?
Power Automate works in UTC and returns ISO 8601 dates. formatDateTime() without a format uses the ‘o’ format, such as 2026-04-25T07:00:00.0000000Z.
What does the Z at the end of a date mean?
Z means the time is in UTC. In a custom format string, though, Z is only printed as a letter, so use it only for values that are already UTC.
How do I convert a date to ISO 8601 in a US time zone?
Build the local date and time as text, then use convertToUtc(value, ‘Eastern Standard Time’) to get the UTC ISO value. Microsoft explains the date functions in its guide to date and time values.
How do I fix ‘The date time string must match ISO8601 format’?
Make sure the value is a real date. Day-first text such as 28/09/2026 needs parseDateTime() with a locale, and empty values need an empty() check.
Why does an Excel time show the year 1899?
Excel stores time-only values with a placeholder date. Take only the time part with formatDateTime(value, ‘HH:mm:ss’) and combine it with the date column.

I have worked with Microsoft technologies for more than 18 years, including SharePoint, Microsoft 365 and the Power Platform (Power Apps, Power Automate and Power BI), at companies like HP, TCS and KPIT. I started EnjoySharePoint in 2011 to share the solutions I build in real projects with readers in the United States, Canada, the United Kingdom, Australia, New Zealand and beyond. Microsoft has recognized this work with the Microsoft MVP award 13 times since 2014.