Swift中如何使用完整时区名称获取Date对象?
Great question! The short answer is yes, but it depends entirely on the programming language/runtime environment you’re working with—since different tools handle timezone display name parsing differently. Let’s break down how to pull this off in some of the most common environments:
JavaScript (Browser & Node.js)
Native JavaScript Date objects don’t directly accept full timezone display names like "Pacific Standard Time" in their constructor. However, you have two solid options:
Option 1: Use a third-party library
Libraries like luxon or moment-timezone are built to handle this exact scenario. They map human-readable timezone names to their underlying IANA identifiers automatically. Here’s a luxon example:
import { DateTime } from 'luxon'; const dateTimeStr = "2017-04-15T12:00:00"; const timeZoneName = "Pacific Standard Time"; // Convert to a native JS Date object const jsDate = DateTime.fromISO(dateTimeStr, { zone: timeZoneName }).toJSDate();
Option 2: Manual mapping with Intl API
If you want to avoid third-party libraries, you can use the Intl.DateTimeFormat API to reverse-engineer the IANA timezone identifier from the display name, then use that to create your Date object. Note that this requires handling potential name ambiguities (e.g., "Central Standard Time" can refer to US or Australian timezones).
Java (8+)
Java’s modern Time API (java.time) doesn’t directly accept display names like "Pacific Standard Time" for ZoneId creation, but you can reverse-lookup the correct ZoneId by matching the display name:
import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.TextStyle; import java.util.Date; import java.util.Locale; import java.util.Optional; public class TimezoneExample { public static void main(String[] args) { String dateTimeStr = "2017-04-15T12:00:00"; String timeZoneName = "Pacific Standard Time"; // Find the matching ZoneId using US locale (to match the display name) Optional<ZoneId> zoneOptional = ZoneId.getAvailableZoneIds().stream() .map(ZoneId::of) .filter(zone -> zone.getDisplayName(TextStyle.FULL, Locale.US).equals(timeZoneName)) .findFirst(); if (zoneOptional.isEmpty()) { throw new IllegalArgumentException("No timezone found for name: " + timeZoneName); } // Convert to a legacy Date object (if needed) ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateTimeStr).withZoneSameInstant(zoneOptional.get()); Date date = Date.from(zonedDateTime.toInstant()); } }
Note: Always specify the correct locale when matching display names—this ensures you get the right timezone, especially for names that vary by region.
Python (3.9+)
Python’s built-in zoneinfo module (or the third-party pytz for older versions) uses IANA timezone identifiers, but you can map display names to these identifiers by checking timezone metadata:
from datetime import datetime import zoneinfo def get_date_from_timezone_name(date_time_str: str, time_zone_name: str) -> datetime: # Find the matching IANA timezone iana_zone = None for zone_name in zoneinfo.available_timezones(): tz = zoneinfo.ZoneInfo(zone_name) # Get the standard timezone name (non-DST) std_name = tz.tzname(datetime.now(tz), is_dst=False) if std_name == time_zone_name: iana_zone = zone_name break if not iana_zone: raise ValueError(f"Could not find timezone matching name: {time_zone_name}") # Create the datetime object in the target timezone return datetime.fromisoformat(date_time_str).astimezone(zoneinfo.ZoneInfo(iana_zone)) # Usage date_obj = get_date_from_timezone_name("2017-04-15T12:00:00", "Pacific Standard Time")
Tip: For ambiguous names (like "Eastern Standard Time"), add a locale check or filter by region to narrow down the correct timezone.
Key Takeaway
Most native runtime libraries prioritize IANA timezone identifiers (like America/Los_Angeles) over human-readable display names because display names can be ambiguous or locale-dependent. However, you can always map the display name to the corresponding identifier manually, or use a third-party library that handles this mapping for you.
内容的提问来源于stack exchange,提问作者Ankur Prakash

