我有一个表T1,其中Id、Name和TimeZone作为列。TimeZone列具有类似于America/Chicago的IANA (TZDB)格式,我从T1获得数据,如
response = T1.Where(t => t.Id == 9).Select(rez => new
{
RezName = rez .Name,
Offset = ...
});在Offset内部,我需要在几分钟内获得当前偏移量(对于有偏移量的America/Chicago,类似于-300 )。是否有一种方法可以在LINQ查询中获得偏移分钟,还是只在select之后迭代并计算每个元素的本地时间?
发布于 2022-03-28 19:25:14
当您最初使用nodatime标记您的问题时,下面是如何利用NodaTime实现此功能的方法:
using NodaTime;..。
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时间即可完成此操作:
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查询。
https://stackoverflow.com/questions/71652442
复制相似问题