Billings, Montana and Its Time Zone: The Practical Details
Most people think Mountain Time is simple because it's just "UTC-7." It's not that simple in practice. I spent three months debugging a scheduling system where every incident report from Billings was arriving two hours off, and the root cause wasn't the offset itself—it was how the system handled the transition week. Billings, Montana sits in the Mountain Time Zone and uses MST (UTC-7) during standard time and MDT (UTC-6) during daylight saving time. Montana observes DST, unlike Arizona, so you do get that annual shift. The IANA identifier is America/Denver, which also covers Billings. When you're working with timestamps, you reference that identifier directly rather than hardcoding any offset. The confusion usually starts when people assume MST is a fixed offset. It isn't. MST is the winter offset only. If you store a time as "Mountain Time" without specifying whether DST is active, you're leaving ambiguity in the data. I learned this the hard way when we built a shift-scheduling tool for a rural healthcare clinic outside Billings. The initial build used a static UTC-7 offset for everything. For nine months it worked fine. Then the spring transition hit and every scheduled shift after the second Sunday in March was stamped an hour earlier than it should have been. We missed three shift confirmations because the notification system used UTC-7 as a constant rather than evaluating whether DST was currently in effect for that date.
The fix was straightforward but tedious. We switched to storing all times as UTC and converted to America/Denver only at the presentation layer using the system's timezone database. That eliminated the need for any DST-aware logic in the scheduling engine itself. We also added a validation check that caught any timestamp with a manually hardcoded offset and flagged it for review. That alone saved us from repeating the same mistake on other parts of the system.
Common Pitfalls That Nobody Warns You About
One thing beginners consistently miss is that the America/Denver timezone ID covers much more than just Colorado. It includes all of Montana, most of Idaho, parts of Kansas, and a few counties in neighboring states. If your system logic assumes "Mountain Time" means only Colorado-based data, you'll silently mislabel timestamps from Billings or Missoula because they share the same zone ID. This isn't a bug in the timezone database. It's a bug in the assumption that zone boundaries match state lines. Another issue involves the Spring Forward transition itself. On the second Sunday in March, the clock jumps from 2:00 AM to 3:00 AM. Any event scheduled between those hours doesn't exist. If your system accepts a local time entry of "2:30 AM MST" without validation, it will either reject the entry or silently assign it to the next valid hour depending on how the conversion library handles ambiguous gaps. Most libraries reject it, which causes unexpected failures in forms and APIs. The workaround is to validate for non-existent times before storing anything and prompt the user to adjust their input. We added a pre-validation step that runs before any timestamp gets committed and it catches roughly two minutes of unexpected errors per month in our system. Fall Back on the first Sunday in November creates the opposite problem. The hour from 2:00 AM to 3:00 AM happens twice. A timestamp of "1:30 AM" is ambiguous because it could be MDT or MST. Most modern libraries resolve this by defaulting to the first occurrence, but that default isn't always correct for scheduling purposes. If a shift starts at 1:30 AM and spans across the transition, the start and end times can end up on different sides of the clock change, and the duration calculation becomes wrong. We handled this by storing the UTC equivalent at the point of entry instead of relying on the library's default disambiguation. It adds one extra conversion step but eliminates the ambiguity entirely.
Get the Full Details

What Works in Practice
If you're building anything that handles Billings timestamps, use UTC as your internal storage format. Never store a local time with an attached offset unless you're also storing the timezone identifier. Use the America/Denver zone ID when displaying times to users. Keep your system updated with the latest IANA timezone database, because the rules change occasionally. The US moved DST to its current schedule in 2007, and any system running older timezone data will miscalculate transition dates. For quick reference, Billings is UTC-7 in standard time and UTC-6 during DST. There's no regional exception within Montana. No part of the state skips DST. If you see a claim that a specific Montana county operates differently, it's incorrect. The entire state follows the same rules under the America/Denver identifier. The biggest bottleneck I've seen is teams that try to maintain a separate DST adjustment table instead of using the timezone database. It works until Congress changes the law, which happened in 2007 and caused a lot of broken schedules for organizations that had hardcoded the old March-to-October window. A properly configured timezone library updates automatically when the database is refreshed. A custom table requires manual maintenance and a process for tracking legislative changes, which most organizations don't have the bandwidth for. Stick with the library approach unless you have a compelling reason not to.
I also recommend testing your system against the 2007 transition date specifically if your software has been around since before then. That was the last major DST rule change in the US, and legacy systems that weren't updated still use the old pre-2007 rules. Running a single test case for March 11, 2007, will tell you immediately whether your system has this problem. We found three microservices in our stack that hadn't been updated and were still treating DST as starting on the first Sunday in April.