The fourth hand
How a caller GMT ended up on Wear OS, and why the format's own limit is what made it work
A GMT watch has a fourth hand and a scale that runs to 24 instead of 12, so wherever that hand points is the hour in some other part of the world. There are two ways watchmakers build that. In a traveller's GMT the local hour hand is the one that moves independently, jumping in whole hours, while the fourth hand keeps running on home time: you land, pull the crown, drag local time to where you are, and home is still there. In a caller GMT it is the other way round. The local hands are left alone and the fourth hand itself is the one you set, which is what you want when you are not travelling anywhere but are calling someone who is.

I'm a fan of GMT watches, so naturally I always wanted to build something in this genre for Wear OS, where world time is usually presented as a complication slot showing a second time zone, which is convenient yet absolutely boring and lacks the finesse of traditional GMT watches.

What I could not find was the mechanism itself. So I tried to build it, and spent most of that time discovering that the format it has to live in will not do the one calculation the whole idea depends on.
Meridan. The red hand is the fourth one, and the ring it points at runs to 24
Reading it
The inner ring is a 24 hour scale with 24 at the top and 12 at the bottom. The three white and orange hands are the ordinary local time. The red hand is the fourth: one turn a day, pointing at the hour in whichever zone is set.

You set the zone once, in the watch face settings: 25 whole hour offsets from UTC minus 11 to UTC plus 13, plus three of the half hour ones, 28 in all. Underneath the date the dial prints which is active, so you never have to remember what you chose.

There is one way it beats the mechanical version. On a caller GMT, setting local time by the crown drags the fourth hand along with it, so the moment you actually travel you have to reset the far zone too, which is why the caller is the office watch and not the travelling one. Here local time arrives from the phone and the fourth hand is anchored to UTC, which does not care where you are standing. Fly anywhere, the local hands follow the phone, the fourth hand keeps pointing at the same zone it pointed at yesterday, and you never touch a setting.
The same instant, three zones. The local hands do not move, only the fourth one
What the format allows
Watch faces on Wear OS are written in Watch Face Format, which is XML. Not XML that configures code, XML that is the entire face. There is no code. The system reads the file and draws it.

It is less limiting than it sounds. Elements carry expressions, and expressions read data sources and do arithmetic on them, so a hand angle can be a formula rather than a constant.

The trouble is which data sources exist. For time there is the device clock in a dozen forms, and the device's own zone: identifier, abbreviation, offset in minutes, offset in minutes including summer time. Every one of them is about the watch you are wearing. There is no source meaning "the zone the user picked", because the format has no notion that a user picked one.

What the user picks is a list configuration. Its options carry an id, a display name, screen reader text and an icon. The id is a string, and configuration values come back to expressions as strings too.

So there is no concrete data on UTC time to read. But the interesting part is that it can be calculated. The device knows its local time and its own offset, both are data sources, and subtracting one from the other gives UTC.

The only care needed is units. The data source HOUR_0_23_MINUTE is the hour with the minute as a fraction, so multiplying by 60 gives minutes since local midnight. The device offset is already in minutes. And a day is 1440 minutes while the dial is 360 degrees, so one minute is a quarter of a degree.

UTC minutes = local hour x 60 - device offset in minutes

hand angle = UTC minutes x 0.25

Which in the file is the value of one attribute:
([HOUR_0_23_MINUTE] * 60 - [TIMEZONE_OFFSET_MINUTES_DST]) * 0.25 
Staying in minutes rather than converting to hours is what makes the half hour zones work without a special case. Iran, India and central Australia sit thirty minutes off their neighbours, and thirty minutes is 7.5 degrees, which puts the hand between two marks because that is where it belongs.

Where the number lives
So now there is a hand that always shows UTC and always will. What is left is to add the chosen zone to it, and the chosen zone is the number the format refuses to hand over.

The way out came from re-reading what a list configuration actually is. It is not only a menu. Placed inside the scene, it is a structural switch: it holds a set of alternatives and the system draws the one the user selected, discarding the rest.

Which means the option does not need to carry a number. The option can be the number. Twenty eight copies of the same hand, each wrapped in a group with its own constant rotation:

group angle = (offset in minutes x 0.25 + 360) mod 360

That expression never runs on the watch. It runs once, on my machine, while the file is being written, and what ships is 28 literal angles. UTC plus 1 is a group at 15 degrees, UTC plus 5:30 is a group at 82.5, UTC minus 11 is a group at 195.

Twenty eight copies sounds expensive and is not. The branches share one drawable, so the artwork is stored once no matter how many groups point at it. What multiplies is a few lines of markup each. And the switch resolves before drawing, so exactly one branch reaches the renderer per frame. The other 27 cost nothing at all at runtime.
It took me a long time to notice what I had actually built. The hand shows UTC. The scale is printed. Between them sits a fixed rotation chosen by the wearer. That is a bezel. I had set out to make a caller GMT, where the fourth hand is the part that moves, and the format would not let the fourth hand move by anything the wearer chose. So the ring moved instead. Two different mechanisms on the bench, and the same angle between two scales at the end of both. The constraint that would not let me compute the zone had pushed me from one solution into the other, and the other is how the complication was solved the first time, by people with no computer at all.
What it does not know
UTC plus 5 points at the mark, UTC plus 5:30 sits halfway to the next one
The zone you pick is an offset from UTC, not a place. The face knows about summer time where you are, because the system tells it. It has no way to know about summer time where the second time zone is.

So twice a year, when the far zone changes and yours does not, the fourth hand is an hour out until you move the setting one notch.

I would like to claim I designed that. On a mechanical GMT, when the far zone goes onto summer time, you move it one click, by the hand or by the bezel depending on the watch. Same gesture, same two weeks of the year, for the same reason. But it is mostly a format limitation, which by accident is also a nod to a traditional GMT watch.
Notes from the making
In always on, the three bezel complications fade and drift outward, each in its own direction, the 24 hour scale dims, and a set of 12 hour numerals grows in for easier local time reading.
The ambient transition steps
Everything else is ordinary watch face work: eight colour pickers with 72 options each, fourteen hand styles, six presets.
Six presets. Only the accent colour differs between them
Watch Face Format has no rotating bezel, no memory between sessions, and no arithmetic on what the wearer chose. What it does have is a switch that picks between prepared pieces of geometry, and it turns out that is enough, because a caller GMT was never a calculation.

It is two scales and a constant angle between them. Watchmakers implemented that with a knurled ring because a knurled ring was what they had. Here the same idea fits in one attribute of one group, repeated 28 times because repetition is the only loop the format offers.

The interesting part of a constraint is rarely what it stops you doing. It is what it makes you look at again.

Meridan is on Google Play as a part of Time Flies Select, a premium collection of watch faces with advanced features rooted in horological traditions.
A true caller GMT for Wear OS, with 28 selectable time zones
Meridan
Premium collection