如何从数据库存储的UTC时间与时区偏移毫秒值获取用户时区信息
如何通过UTC时间及时区偏移毫秒值获取时区信息
仅靠存储的UTC时间和固定时区偏移毫秒值,无法唯一确定对应的时区——因为多个不同时区可能有相同的UTC偏移,且同一时区在夏令时生效时段会改变偏移值。但可以通过以下方式获取匹配的时区候选,再结合业务场景筛选:
1. 转换偏移毫秒为标准UTC偏移量
首先修正偏移量的符号:你的代码中,本地时间加上偏移毫秒得到UTC时间,说明存储的timezoneOffsetMilliSeconds是UTC与本地时间的差值(UTC = 本地时间 + 偏移毫秒)。而时区的标准UTC偏移是「本地时间 - UTC」,所以需要取反转换为TimeSpan:
// 修正符号,得到时区的标准UTC偏移 TimeSpan targetUtcOffset = TimeSpan.FromMilliseconds(-(double)timezoneOffsetMilliSeconds);
2. 遍历系统时区匹配偏移与时间点
使用TimeZoneInfo类遍历系统中所有可用时区,筛选出在指定UTC时间点偏移量匹配的时区:
// 获取系统所有可用时区 IEnumerable<TimeZoneInfo> allTimeZones = TimeZoneInfo.GetSystemTimeZones(); // 筛选在目标UTC时间点偏移匹配的时区 List<TimeZoneInfo> matchingTimeZones = allTimeZones .Where(tz => tz.GetUtcOffset(utc) == targetUtcOffset) .ToList();
3. 提取时区信息
从匹配的时区列表中,你可以获取所需的标识:
- 唯一时区ID:
tz.Id(例如"Central Standard Time"),这是最可靠的标识,无歧义。 - 标准名称/夏令时名称:
tz.StandardName(例如"Central Standard Time")、tz.DaylightName(例如"Central Daylight Time")。 - 注意:时区缩写(如
CST)没有统一标准,同一缩写可能对应多个时区(比如CST可指美国中部时间或中国标准时间),建议优先使用时区ID。
关键提示
如果业务需要唯一确定时区,建议在存储UTC时间的同时,额外存储时区的ID(如"Central Standard Time"),而不是仅依赖偏移量——偏移量无法区分同偏移的不同时区,也无法应对夏令时导致的偏移变化。
内容的提问来源于stack exchange,提问作者Thomas.Benz
相关产品推荐
相关产品推荐

