There is a national time station here in the US in Colorado, WWVB. It sends out time signals 24/7 for the purposes of national time synchronization with the Atomic Clock that is operated by NIST.
I went down a rabbit hole to see how this works. I have a Casio M5610U-1, which is a modern take on the original Casio DW-5000C. Aesthetically, it looks very much like the OG with a few new key features: solar power, LED frontlight and Multiband 6. The watch faithfully synchronizes every night, between midnight and 0500, and does so pretty consistently.
WWVB was first put on the air on July 4-5, 1963. It’s located in Fort Collins, CO and broadcasts on a frequency of 60Hz. The digital time code that allows clocks and watches to actually decode and set themselves was added July 1, 1965. It broadcasts around 50 to 70 kW and, with such tremendous power and low frequency, covers most of CONUS and doesn’t require line-of-sight.
The station sends a pulse-width modulated binary time code once per minute. Every minute is sent as 60 pulses, one per second, indicated by a brief reduction in power on the carrier signal. Each second is either:
| Pulse | Meaning |
| 0.2s low | Binary 0 |
| 0.5s low | Binary 1 |
| 0.8s low | Delimiter |
These pulses encode
- Year
- Month
- Day
- Day of week
- Hour
- Minute
- Leap seconds
- Daylight saving time flags
So, what ever time piece you synchronize with WWVB collects a full minute of pulses and decodes them into a timestamp. The time broadcast is accurate to about ±0.1 microseconds. The data is sent in Binary-Coded Decimal
An example. Let’s say the atomic clock time is:
2026-01-10 21:37:00 (Saturday)
Minute = 37
BCD:
- Tens = 3 →
0011 - Ones = 7 →
0111
WWVB bit positions:
Minutes:
Bit 1 = 1
Bit 2 = 2
Bit 3 = 4
Bit 4 = 8
Bit 5 = 10
Bit 6 = 20
Bit 7 = 40
37 = 20 + 10 + 4 + 2 + 1
So bits:
40 20 10 8 4 2 1
0 1 1 0 1 1 1
Hour = 21
21 = 20 + 1
Hours bits:
20 10 8 4 2 1
1 0 0 0 0 1
Day of year
Jan 10, 2026 → Day 10 of year
Day = 010
100s = 0
10s = 1
1s = 0
Year = 26
20 + 6 → BCD
Day of week
Saturday = 6
(WWVB: 1=Mon … 7=Sun)
Here’s a simple view of the digital frame broadcast by WWVB:sec 0 = M
sec 1–8 = minutes
sec 9 = M
sec 10–18 = hours
sec 19 = M
sec 20–28 = day of year
sec 29 = M
sec 30–38 = year
sec 39 = M
sec 40–44 = day of week
sec 45 = M
sec 46–58 = DST, leap, parity, etc
sec 59 = M
So, the encoded form of our example:
Minute = 37 → 0110111
Hour = 21 → 100001
Day = 10 → 000001010
Year = 26 → 00100110
Day of week = 6 → 110
This is what the pulse stream would look like over that minute:
| Second | Binary | Pulse Drop Length | Timestamp Section |
| 0 | M | 800ms | |
| 1 | 1 | 500ms | Minute |
| 2 | 1 | 500ms | Minute |
| 3 | 1 | 500ms | Minute |
| 4 | 0 | 200ms | Minute |
| 5 | 1 | 500ms | Minute |
| 6 | 1 | 500ms | Minute |
| 7 | 0 | 200ms | Minute |
| 8 | 0 | 200ms | Minute |
| 9 | M | 800ms | |
| 10 | 1 | 500ms | Hour |
| 11 | 0 | 200ms | Hour |
| 12 | 0 | 200ms | Hour |
| 13 | 0 | 200ms | Hour |
| 14 | 0 | 200ms | Hour |
| 15 | 1 | 500ms | Hour |
| 16 | 0 | 200ms | Hour |
| 17 | 0 | 200ms | Hour |
| 18 | 0 | 200ms | Hour |
| 19 | M | 800ms | |
| 20 | 0 | 200ms | Day |
| 21 | 0 | 200ms | Day |
| 22 | 0 | 200ms | Day |
| 23 | 0 | 200ms | Day |
| 24 | 0 | 200ms | Day |
| 25 | 1 | 500ms | Day |
| 26 | 0 | 200ms | Day |
| 27 | 1 | 500ms | Day |
| 28 | 0 | 200ms | Day |
| 29 | M | 800ms | |
| 30 | 0 | 200ms | Year |
| 31 | 0 | 200ms | Year |
| 32 | 1 | 500ms | Year |
| 33 | 0 | 200ms | Year |
| 34 | 0 | 200ms | Year |
| 35 | 1 | 500ms | Year |
| 36 | 1 | 500ms | Year |
| 37 | 0 | 200ms | Year |
| 38 | 0 | 200ms | Year |
| 39 | M | 800ms | |
| 40 | 0 | 200ms | Day of week |
| 41 | 1 | 500ms | Day of week |
| 42 | 1 | 500ms | Day of week |
| 43 | 0 | 200ms | Day of week |
| 44 | 0 | 200ms | Day of week |
| 45 | M | 800ms | |
| 46 | 0 | 200ms | UT1 Sign |
| 47 | 1 | 500ms | UT1 Correction |
| 48 | 0 | 200ms | UT1 Correction |
| 49 | M | 800ms | |
| 50 | 0 | 200ms | Leap Second Warning |
| 51 | 1 | 500ms | DST in effect |
| 52 | 1 | 500ms | DST change imminent |
| 53 | 0 | 200ms | Leap year |
| 54 | 0 | 200ms | Parity bit |
| 55 | 1 | 500ms | Parity bit |
| 56 | 1 | 500ms | Parity bit |
| 57 | 0 | 200ms | Parity bit |
| 58 | 1 | 500ms | Parity bit |
| 59 | M | 800ms |
WWVB doesn’t transmit seconds in this frame, as you can see. It transmits the minute boundary, and the seconds are inferred from the pulse timing. The start of each second is extremely accurate, phase-locked to the atomic clock by the falling edge of each pulse.
A fascinating look into how my Casio synchronizes each night, or any clock that can read these pulses–all from an era before we had even landed a person on the moon and long before the modern Internet.