Skip to main content
← Back to Table of Contents

Summary

Searchable IANA timezone picker with a Gravity UI clock icon on the trigger and in menu rows. Stores a single timezone identifier string. Display labels are city, country (Warsaw, Poland / Warszawa, Polska), not generic names like “Poland Time”.

Basic usage

Standard timezone picker

Browser-aware detection


State & validation

Stored value

State is a single IANA identifier string — never the display label.
The picker shows city, country (Warsaw, Poland / Warszawa, Polska) plus a UTC offset badge (UTC+02:00). Generic names like “Poland Time” are not used.

Validation rules

Built-in validation ensures the submitted identifier is in the resolved timezone list.

Configuration API

All methods accept Closure unless noted.

timezones() / exceptTimezones()

Limit the list to specific regions or exclude problematic zones:
UTC stays in the default IANA list (servers, logs, APIs). It is optional, not required:

browserTimezoneDefault()

When enabled and state is empty, it attempts to detect the user’s timezone via Alpine/JS.

locale()

City and country labels follow app()->getLocale() by default (Warsaw, Poland / Warszawa, Polska). Pin a language per field, independently of the panel locale:
Override the full display string in lang/{locale}/timezones.php (publish the package lang files). Keys use __ instead of /:
Stored state is still the IANA id (Europe/Warsaw), never the translated label.

Real-world examples

User profile settings

Event scheduler


Playground

/admin/flex-fields-playground/timezone-field See Playground for setup.

CSS classes (reference)


Performance

Payload vs SSR trade-offs

Prefer timezones([...]) when a form only needs a handful of zones so the shared full catalog is never queued. Prefer the default registry path when you need the full IANA list — one catalog for every TimezoneField on the page beats N copies inside x-data.

Ops notes

Timezone search shares the Select-family Livewire search rate limit (filament-flex-fields.select.search_rate_limit_per_minute). Keys use the authenticated user id or Request::ip() — configure Laravel TrustedProxies when the app sits behind a reverse proxy so client IPs are not taken from spoofable forwarded headers.