gpt4 book ai didi

c# - 用时区和夏令时确定一天的开始

转载 作者:太空狗 更新时间:2023-10-29 18:06:10 32 4
gpt4 key购买 nike

我在 session 中将用户的时区存储为小数。例如,如果用户在 EST 时区,我会有

UserTimeZone = -5.00;

数据库中的数据以 UTC 格式存储,因此我想计算该用户一天的开始和结束时间,以便当用户需要特定日期的数据时,记录会调整时区。

这就是我正在做的:

DateTime StartDate =  DateTime.Now.ToUniversalTime();

StartDate = StartDate.AddHours((double)UserTimeZone);
StartDate = StartDate.Date;
StartDate = StartDate.AddHours((double)UserTimeZone);

DateTime EndDate = StartDate.AddHours(24);

我遇到的问题是这没有考虑夏令时,所以即使认为 EST 时间比 UTC 晚 5 小时,但由于夏令时变化,目前它实际上比 UTC 晚 4 小时。

您有什么建议?谢谢。

最佳答案

要进行此类计算,您需要使用 TimeZoneInfoDateTimeOffset 类。

首先,我们需要获取本地时间和用户本地时间的 TimeZoneInfo 实例:

var localTimezone = TimeZoneInfo.Local;
var userTimezone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");

这里需要注意的是,您需要知道用户本地时区的 ID(您当前拥有的偏移量是不够的)。您可以获得系统识别的所有 TimeZoneInfo 实例的列表 TimeZoneInfo.GetSystemTimeZones ,然后您需要一种将用户提供的时区与其中一个时区相匹配的方法。

对于这个例子,我硬编码了 EST。

然后您需要获取本地时区今天午夜(一天开始)的 DateTimeOffset 实例:

var todayDate = DateTime.Today;
var todayLocal = new DateTimeOffset(todayDate,
localTimezone.GetUtcOffset(todayDate));

鉴于此,您可以计算 DateTimeOffset 实例,它表示用户时区中“今天”(基于您的本地时间)的午夜。 请注意,根据时区,这实际上可能是用户所在时区的 future !

var todayUser = TimeZoneInfo.ConvertTime(todayLocal, userTimezone);

最后,您可以像这样为两个日期创建时间戳:

var epochStart = DateTime.Parse("01/01/1970 00:00:00");
var todayLocalTs = (todayLocal.Ticks - epochStart.Ticks)/TimeSpan.TicksPerSecond;
var todayUserTs = (todayUser.Ticks - epochStart.Ticks) / TimeSpan.TicksPerSecond;

关于c# - 用时区和夏令时确定一天的开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7381865/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com