首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从IANA时区获得偏移分钟

从IANA时区获得偏移分钟
EN

Stack Overflow用户
提问于 2022-03-28 19:00:52
回答 1查看 243关注 0票数 1

我有一个表T1,其中IdNameTimeZone作为列。TimeZone列具有类似于America/Chicago的IANA (TZDB)格式,我从T1获得数据,如

代码语言:javascript
复制
response = T1.Where(t => t.Id == 9).Select(rez => new
           {
              RezName = rez .Name,
              Offset = ...
           });

Offset内部,我需要在几分钟内获得当前偏移量(对于有偏移量的America/Chicago,类似于-300 )。是否有一种方法可以在LINQ查询中获得偏移分钟,还是只在select之后迭代并计算每个元素的本地时间?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-28 19:25:14

当您最初使用nodatime标记您的问题时,下面是如何利用NodaTime实现此功能的方法:

代码语言:javascript
复制
using NodaTime;

..。

代码语言:javascript
复制
Instant now = SystemClock.Instance.GetCurrentInstant();
response = T1.Where(t => t.Id == 9)
   .Select(rez => new
   {
      RezName = rez.Name,
      TimeZone = rez.TimeZone
   })
   .AsEnumerable()
   .Select(x => new
   {
      RezName = x.RezName,
      Offset = (int) DateTimeZoneProviders.Tzdb[x.TimeZone]
                         .GetUtcOffset(now).ToTimeSpan().TotalMinutes
   });

如果在Linux或macOS上使用macOS,或者在Windows上使用.NET 6或更高版本,则无需Noda时间即可完成此操作:

代码语言:javascript
复制
DateTimeOffset now = DateTimeOffset.UtcNow;
Instant now = SystemClock.Instance.GetCurrentInstant();
response = T1.Where(t => t.Id == 9)
   .Select(rez => new
   {
      RezName = rez.Name,
      TimeZone = rez.TimeZone
   })
   .AsEnumerable()
   .Select(x => new
   {
      RezName = x.RezName,
      Offset = (int) TimeZoneInfo.FindSystemTimeZoneById(x.TimeZone)
                         .GetUtcOffset(now).TotalMinutes
   });

另一种选择是使用与第二个示例类似的代码从`TZConvert.GetTimeZoneInfo到TimeZoneConverter

请记住,所有这些返回从UTC (以分钟为单位,正值为格林尼治标准时间以东)的当前偏移。对于America/Chicago来说,这是目前的-300,因为夏令时是有效的。当白天结束时,它将返回-360

注意,在上面的示例中,时区代码必须发生在查询物化之后,因为像EF这样的LINQ提供程序不可能将其转换为SQL查询。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71652442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档