Blog

The curious case of the 24-hour time format in Swift

Recently, I have found out how time formats on iOS devices can impact the ones inside a mobile app. Let's see how to make an application always display the 24-hour format regardless of your iPhone's or iPad's settings.

Table of Content

  1. Time Formats on iOS devices
  2. Default 24-hour time format
  3. Hour formats conflict
  4. What I did
  5. Wrapping up

Time formats on iOS devices

As you probably know, in iOS you can choose between a 24-hour date format and a 12-hour date format (A.M./P.M.). Users usually choose one of these formats depending on local tradition or habits. They can change the format anytime they want via Settings (Settings > General > Date & Time).

What was something new for me, 24/12-hour formats have a big impact on date formats inside an app.

Default 24-hour time format

In one of the apps that I’m developing, a client wanted a 24-hour date format. It felt natural for him, because this format is popular in his region.

So, from the API I’m getting a String with a Rails format of the date. Then I need to parse this JSON endpoint into `Date()`. More about handling Rails date formats in Swift can be found here.

This `Date()` object needs to be changed into a `String` that is displayed in app. I use a simple `DateFormatter()` with parameters like these:

dateFormatter.dateFormat = "HH:mm"

Hour formats conflict

Soon afterwards, one of the users made a request claiming that the app had a bug. According to his claims, the dates were not displayed in a proper way.

After a quick investigation, we found out that he was using a 12-hour date format on his iPhone than the default 24-hours date format. And this little change impacted all the dates shown inside the app.

What I did

Of course, the simplest solution was to convince the user to change his Settings and use a 24-hour date format instead. But 'simplest' does not mean 'best'.

So I dove into the DateFormatter() to find out if there is a solution to force the app to display the hours in a certain way.

I wanted the app to always display the 24-hour date format, no matter if an iPhone uses a 12-hour or 24-hour date format. I needed to set HH and hide AM/PM markers. You can achieve this by using `customFormatter.setLocalizedDateFormatFromTemplate` on DateFormatter():

customDateFormatter.setLocalizedDateFormatFromTemplate("HH:mm a")

Then you need to hide the AM/PM markers:

customDateFormatter.amSymbol = ""

customDateFormatter.pmSymbol = ""

But this is not all yet. Sometimes the hour format can be forced by a particular region, so the best solution is to set locale:

customDateFormatter.locale = Locale(identifier: "en_US")

Wrapping up

That’s all, folks! Now the date will be always dispalyed in the 24-hour format, no matter if a user changed their iPhone Settings or not.

Photo by Han Chau on Unsplash

Recommended reads

Start a project with your dedicated software house

Top

Notice

We do not track you online. We use only session cookies and anonymous identifiers for the purposes specified in the cookie policy. No third-party trackers.

I understand
Elo Mordo!Elo Mordo!