Dlaczego warto użyć API stref czasowych?

Obliczanie czasu w różnych strefach "ręcznie" to prosta droga do błędów — zwłaszcza gdy uwzględniamy czas letni (DST), nieregularne zmiany stref i ułamkowe offsety (np. Indie UTC+5:30). Dedykowane API lub biblioteki takie jak IANA Time Zone Database zawierają aktualne dane o wszystkich strefach, zmianach DST i historycznych modyfikacjach.

WorldTimeAPI — najprostszy start

WorldTimeAPI (worldtimeapi.org) to darmowe, nie wymagające klucza API. Zwraca aktualny czas dla wybranej strefy lub na podstawie IP.

// JavaScript — pobierz aktualny czas dla Warszawy
fetch('https://worldtimeapi.org/api/timezone/Europe/Warsaw')
  .then(r => r.json())
  .then(data => {
    console.log(data.datetime);      // "2024-11-15T14:32:00+01:00"
    console.log(data.utc_offset);    // "+01:00"
    console.log(data.dst);           // false (czas zimowy)
    console.log(data.timezone);      // "Europe/Warsaw"
  });

Konwersja stref w przeglądarce — Intl.DateTimeFormat

Nowoczesne przeglądarki mają wbudowane wsparcie dla stref czasowych przez API Intl. Nie wymaga żadnych zewnętrznych bibliotek:

// Aktualny czas w Tokio
const tokyoTime = new Intl.DateTimeFormat('pl-PL', {
  timeZone: 'Asia/Tokyo',
  hour: '2-digit',
  minute: '2-digit',
  second: '2-digit',
  hour12: false
}).format(new Date());
console.log('Tokio:', tokyoTime); // "Tokio: 22:15:43"

// Oblicz offset UTC dla dowolnej strefy
function getUTCOffset(timezone) {
  const now = new Date();
  const utc = new Date(now.toLocaleString('en-US', {timeZone: 'UTC'}));
  const tz = new Date(now.toLocaleString('en-US', {timeZone: timezone}));
  const diff = (tz - utc) / 3600000;
  return diff;
}
console.log(getUTCOffset('Asia/Kolkata')); // 5.5

Python — biblioteka pytz i zoneinfo

W Pythonie od wersji 3.9 dostępny jest moduł zoneinfo (standardowa biblioteka). Wcześniej popularną opcją była biblioteka pytz.

# Python 3.9+ — zoneinfo (wbudowane)
from datetime import datetime
from zoneinfo import ZoneInfo

warsaw = datetime.now(ZoneInfo('Europe/Warsaw'))
tokyo = datetime.now(ZoneInfo('Asia/Tokyo'))

print(f"Warszawa: {warsaw.strftime('%H:%M %Z')}")  # Warszawa: 14:32 CET
print(f"Tokio:    {tokyo.strftime('%H:%M %Z')}")    # Tokio:    22:32 JST

# Konwersja między strefami
warsaw_noon = datetime(2024, 6, 15, 12, 0, tzinfo=ZoneInfo('Europe/Warsaw'))
ny_time = warsaw_noon.astimezone(ZoneInfo('America/New_York'))
print(f"12:00 Warszawa = {ny_time.strftime('%H:%M')} Nowy Jork")  # 06:00

IANA Time Zone Database

Podstawą wszystkich narzędzi do obsługi stref czasowych jest IANA Time Zone Database (tz database, zoneinfo database). To otwartoźródłowa baza danych utrzymywana przez Internet Assigned Numbers Authority, zawierająca historyczne i aktualne informacje o wszystkich strefach czasowych na świecie — z uwzględnieniem zmian DST, historycznych modyfikacji i specjalnych przypadków. Nazwy stref w formacie "Kontynent/Miasto" (np. Europe/Warsaw, Asia/Tokyo) wywodzą się właśnie z tej bazy.

Darmowe API do wyboru

  • WorldTimeAPI (worldtimeapi.org) — bez klucza, proste, działa przez IP
  • TimeZoneDB (timezonedb.com) — bezpłatny plan, klucz API, szczegółowe dane historyczne
  • IP Geolocation API (ipapi.co) — zwraca strefę czasową na podstawie IP
  • Abstract API Timezones — darmowy plan do 10 000 zapytań/miesiąc