.NET 6中如何解析澳大利亚悉尼时区的DateTime
解析悉尼时区DateTime字符串并自动适配夏令时
在.NET(包括F#)中,可通过TimeZoneInfo类处理时区与夏令时规则,以下是具体实现方案:
1. 获取悉尼时区实例
悉尼所属的澳大利亚东部时区,对应的系统时区ID为"AUS Eastern Standard Time",通过TimeZoneInfo.FindSystemTimeZoneById可获取包含夏令时切换逻辑的时区实例:
open System open System.Globalization let sydneyTimeZone = TimeZoneInfo.FindSystemTimeZoneById "AUS Eastern Standard Time"
2. 按指定格式解析DateTime字符串
你的示例字符串格式为dd/MM/yyyy HH:mm:ss,需用DateTime.ParseExact指定格式解析,避免默认解析的歧义:
let dateString = "20/12/2022 11:26:34" let format = "dd/MM/yyyy HH:mm:ss" // 将解析结果标记为「未指定时区」,明确告知系统这是悉尼当地时间 let parsedUnspecified = DateTime.ParseExact(dateString, format, CultureInfo.InvariantCulture) |> DateTime.SpecifyKind DateTimeKind.Unspecified
3. 自动适配夏令时并转换
TimeZoneInfo内置了悉尼的夏令时规则(每年10月至次年4月启用夏令时),转换时会自动计算正确的UTC偏移:
- 转换为UTC时间(推荐,UTC无时区歧义):
let utcTime = TimeZoneInfo.ConvertTimeToUtc(parsedUnspecified, sydneyTimeZone) // 2022年12月处于悉尼夏令时,偏移为+11:00,最终utcTime结果为2022-12-20 00:26:34
- 保留悉尼当地时区的带偏移信息的时间:
let sydneyDateTimeOffset = DateTimeOffset(parsedUnspecified, sydneyTimeZone.GetUtcOffset(parsedUnspecified)) // 最终结果为2022-12-20 11:26:34 +11:00
关键说明
TimeZoneInfo已内置全球各时区的夏令时规则,无需手动判断夏令时区间。- 必须将解析后的DateTime标记为
Unspecified,避免系统误判为本地时区或UTC时区,确保转换逻辑严格遵循悉尼时区规则。
内容的提问来源于stack exchange,提问作者Martin Thompson
相关产品推荐
相关产品推荐

