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

Check our latest product - it's based on our experience of managing over 50-people strong company. The tool we're missing as a small company and not an enterprise.

humadroid.io is an employee and performance management software. It's an unique tool allowing everyone to be in the loop - by having up to date info about co-workers, time-off, benefits, assets, helping with one-on-ones, being a go-to place for company-wide announcements.

Check out humadroid.io
Top

Contact us

* Required fields

The controller of your personal data provided via this contact form is Prograils sp. z o.o., with a registered seat at Sczanieckiej 9A/10, 60-215 Poznań. Your personal data will be processed in order to respond to your inquiries and for our marketing purposes (e.g. when you ask us for our post-development, maintenance or ad hoc engagements for your app). You have the rights to: access your personal data, rectify or erase your personal data, restrict the processing of your personal data, data portability and to object to the processing of your personal data. Learn more.

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!