Date formatting in Power Apps is the Text() function plus a format string built from tokens. Get the tokens right and you can render any date or time exactly how you want, get the locale prefix wrong and your app breaks for users in another region.
Text(Today(), "[$-en-US]mmmm d, yyyy") // → "July 29, 2026"The full format-token table
Mix and match these in the format string. Literal characters (commas, slashes, spaces) pass through as-is.
| Token | Meaning | Example |
|---|---|---|
| yyyy | 4-digit year | 2026 |
| yy | 2-digit year | 26 |
| mmmm | Full month name | July |
| mmm | Short month name | Jul |
| mm | 2-digit month | 07 |
| m | Month, no leading zero | 7 |
| dddd | Full weekday | Wednesday |
| ddd | Short weekday | Wed |
| dd | 2-digit day | 29 |
| d | Day, no leading zero | 9 |
| hh | 2-digit hour | 09 |
| h | Hour, no leading zero | 9 |
| mm (after h) | 2-digit minutes | 05 |
| ss | 2-digit seconds | 07 |
| AM/PM | 12-hour meridiem | PM |
| [$-en-US] | Locale prefix (portability) | n/a |
h/hh) it means minutes. Keep minutes next to the hour: "hh:mm AM/PM".Why you should prefix with [$-en-US]
A custom format string without a language tag is interpreted in the user's locale at runtime. That means the same app can render differently, or throw "The language is not supported", for a user in another region. Prefixing with [$-en-US] pins the interpretation so your tokens always mean what you wrote:
Text(Now(), "[$-en-US]dddd, mmmm d 'at' h:mm AM/PM") // same everywhereText(Now(), "dddd, mmmm d") // depends on user localeFor the built-in DateTimeFormat enum values (e.g. Text(d, DateTimeFormat.LongDate)) you don't need the prefix, those already respect locale on purpose. Use the prefix for custom token strings.
Recipes
If( DateDiff(dt, Now(), TimeUnit.Minutes) < 60, Text(DateDiff(dt, Now(), TimeUnit.Minutes)) & " min ago", Text(DateDiff(dt, Now(), TimeUnit.Hours)) & " hr ago")// First dayDate(Year(Today()), Month(Today()), 1) // Last day - either worksEOMonth(Today(), 0)DateAdd(Date(Year(Today()), Month(Today()) + 1, 1), -1, TimeUnit.Days)DateAdd(Today(), 7, TimeUnit.Days) // a week outDateAdd(Now(), -3, TimeUnit.Months) // three months agoDateDiff(startDate, endDate, TimeUnit.Days) // span in daysDateValue("2026-07-29") // date onlyDateTimeValue("2026-07-29 14:30") // date + time// Pass a language tag if the text is locale-specific:DateValue("29/07/2026", "en-GB")Timezone gotchas
Now() and Today() are local to the user's device. Values stored in SharePoint/Dataverse are typically UTC. When a saved time looks "off by a few hours," you're seeing UTC-vs-local. Convert explicitly with TimeZoneOffset():
// Stored UTC → show localDateAdd(utcValue, -TimeZoneOffset(utcValue), TimeUnit.Minutes) // Local → UTC for storageDateAdd(localValue, TimeZoneOffset(localValue), TimeUnit.Minutes)DateValue(Text(stored)) or compare against a range, or a 23:00 UTC value can land on the "wrong" day for the user.