Scheduling across time zones is a daily friction point for distributed teams. The actual problem isn’t finding tools — it’s that most teams don’t have a shared system, so every meeting invite involves someone doing timezone math in their head and getting it wrong half the time.
This guide covers the tools and the shared conventions that actually solve time zone coordination.
The Convention You Need First
Before any tool: establish a canonical timezone for your team’s communication.
Common choices:
- UTC — no ambiguity, no daylight saving issues, write as
14:00 UTC - Team lead’s timezone — everyone converts once, to one reference
- Majority timezone — use the timezone where most of the team is
Post this in your team README, Notion page, or Slack channel description:
Team timezone: UTC
All meeting times and deadlines are posted in UTC unless explicitly noted otherwise.
This one convention eliminates 80% of timezone confusion before any tool.
CLI Tools for Terminal-First Developers
tz (Go tool)
A simple command-line timezone viewer:
# Install
go install github.com/oz/tz@latest
# Or download binary from GitHub releases
curl -L https://github.com/oz/tz/releases/latest/download/tz_linux_amd64 \
-o /usr/local/bin/tz && chmod +x /usr/local/bin/tz
# Configure timezones to track
cat > ~/.config/tz/config.toml << 'EOF'
[[zones]]
name = "Local"
[[zones]]
name = "UTC"
[[zones]]
name = "US/Eastern"
[[zones]]
name = "Europe/London"
[[zones]]
name = "Asia/Singapore"
[[zones]]
name = "Australia/Sydney"
EOF
# Run
tz
# Shows current time in all configured zones in a nice TUI
zdump + shell functions
For quick one-off conversions without a separate tool:
# Check current time in specific timezone
TZ="America/New_York" date
TZ="Europe/London" date
TZ="Asia/Tokyo" date
# Convert a specific time to multiple zones
show_meeting_time() {
local TIME="$1" # e.g., "2026-03-21 14:00 UTC"
echo "Meeting: $TIME"
echo "---"
for tz in "America/New_York" "America/Los_Angeles" "Europe/London" "Asia/Singapore" "Australia/Sydney"; do
local local_time=$(TZ="$tz" date -d "$TIME" "+%H:%M %Z %z" 2>/dev/null || \
TZ="$tz" gdate -d "$TIME" "+%H:%M %Z %z" 2>/dev/null)
printf " %-20s %s\n" "$tz" "$local_time"
done
}
# Usage
show_meeting_time "2026-03-21 14:00 UTC"
# Output:
# Meeting: 2026-03-21 14:00 UTC
# ---
# America/New_York 10:00 EDT -0400
# America/Los_Angeles 07:00 PDT -0700
# Europe/London 14:00 GMT +0000
# Asia/Singapore 22:00 SGT +0800
# Australia/Sydney 01:00 AEDT +1100
Add to ~/.bashrc or ~/.zshrc:
# Alias for common conversions
alias utcnow='date -u "+%Y-%m-%d %H:%M UTC"'
alias teamtime='tz'
# Quick "what time is it for my teammates?"
alias whoawake='show_meeting_time "$(date -u "+%Y-%m-%d %H:%M UTC")"'
timedatectl (Linux)
# List all available timezones
timedatectl list-timezones | grep -i "america\|europe\|asia\|pacific"
# Check current system time and timezone
timedatectl status
# Set system timezone (affects all date-based tools)
sudo timedatectl set-timezone UTC
Web Tools
Every Time Zone (everytimezone.com)
The simplest visual overlap tool. Shows a horizontal timeline of the day for all timezones. Drag the current time slider to see what time it is everywhere simultaneously. No account needed.
Best use: Quick “is 3pm UTC okay for everyone?” check before sending a calendar invite.
World Time Buddy (worldtimebuddy.com)
Add multiple cities, get a grid view of overlapping hours. Highlights “good hours” for meetings (within normal working hours for each city).
Booking a meeting:
- Add your team locations
- Scroll to a time that’s green for everyone
- Click it → creates a calendar event with all timezones shown
Time.is
Shows exact current time for any city with millisecond precision. Useful for: “what time is it for Bob right now?” before DMing him at midnight.
# Command-line equivalent
curl -s "http://worldtimeapi.org/api/timezone/America/New_York" | \
python3 -c "import json,sys; d=json.load(sys.stdin); print(d['datetime'])"
Scheduling Overlap: Finding Meeting Windows
For a distributed team, finding a window that works for everyone requires mapping each person’s working hours to UTC:
#!/usr/bin/env python3
# find_overlap.py — find meeting windows given team timezones and working hours
from datetime import datetime, timedelta
import pytz
# Define team members and their working hours (local time)
team = [
{"name": "Alice (NYC)", "tz": "America/New_York", "start": 9, "end": 17},
{"name": "Bob (London)", "tz": "Europe/London", "start": 9, "end": 17},
{"name": "Carol (Sing.)", "tz": "Asia/Singapore", "start": 9, "end": 17},
{"name": "Dave (Sydney)", "tz": "Australia/Sydney", "start": 9, "end": 17},
]
def find_overlap(date_str="2026-03-24"):
date = datetime.strptime(date_str, "%Y-%m-%d")
utc = pytz.UTC
# Convert working hours to UTC ranges
utc_ranges = []
for member in team:
tz = pytz.timezone(member["tz"])
local_start = tz.localize(date.replace(hour=member["start"]))
local_end = tz.localize(date.replace(hour=member["end"]))
utc_start = local_start.astimezone(utc)
utc_end = local_end.astimezone(utc)
utc_ranges.append((member["name"], utc_start, utc_end))
# Find hours that work for everyone
overlap_start = max(r[1] for r in utc_ranges)
overlap_end = min(r[2] for r in utc_ranges)
if overlap_start < overlap_end:
print(f"Overlap on {date_str}:")
print(f" UTC: {overlap_start.strftime('%H:%M')} – {overlap_end.strftime('%H:%M')}")
print("\n Local times:")
for name, _, _ in utc_ranges:
tz_name = next(m["tz"] for m in team if m["name"] == name)
tz = pytz.timezone(tz_name)
print(f" {name}: {overlap_start.astimezone(tz).strftime('%H:%M')} – {overlap_end.astimezone(tz).strftime('%H:%M')}")
else:
print(f"No overlap on {date_str} — teams are too spread across timezones.")
print("Consider async communication or a rotating meeting time.")
find_overlap()
pip install pytz
python3 find_overlap.py
Rotating Meeting Schedule
When there’s no good overlap (e.g., US West Coast + Southeast Asia), a rotating meeting time distributes the inconvenience fairly:
# Example: Weekly sync rotating between 3 slots
# Week 1: 01:00 UTC (good for Asia, bad for Americas)
# Week 2: 14:00 UTC (good for Europe/Americas, bad for Asia)
# Week 3: 22:00 UTC (good for Americas, reasonable for Asia)
# In Google Calendar: create 3 separate recurring events, each every 3 weeks
# Set recurrence: weekly, every 3 weeks
# Week 1 starts on: 2026-03-24
# Week 2 starts on: 2026-03-31
# Week 3 starts on: 2026-04-07
Automating Time Zone Display in Slack
# Slack workflow: auto-post team timezone status daily
# Using Slack's built-in Workflow Builder:
# Trigger: Scheduled → Every day at 09:00 UTC
# Step: Send message to #standup
# Message: "Current time for the team:
# NYC: {{ timezone-conversion time=now tz=America/New_York }}
# London: {{ ... }}
# Singapore: {{ ... }}"
# Or use a script posted by a cron job:
SLACK_WEBHOOK="https://hooks.slack.com/services/YOUR/WEBHOOK"
MSG="*Team times now ($(date -u "+%Y-%m-%d %H:%M UTC"))*
• NYC: $(TZ="America/New_York" date "+%H:%M %Z")
• London: $(TZ="Europe/London" date "+%H:%M %Z")
• Singapore: $(TZ="Asia/Singapore" date "+%H:%M %Z")
• Sydney: $(TZ="Australia/Sydney" date "+%H:%M %Z")"
curl -X POST -H 'Content-type: application/json' \
--data "{\"text\": \"$MSG\"}" "$SLACK_WEBHOOK"
Related Articles
- Best Time Zone Management Tools for Distributed Engineering
- Best Time Zone Management Tools for Global Teams: A
- Best Time Zone Management Tools for Nomads: A Developer
- Best Async Project Management Tools for Distributed Teams
- Best Timezone Management Tool for Distributed Teams
Built by theluckystrike — More at zovo.one