gpt4 book ai didi

c# - 在C#中将时间数据转换为本地时间

转载 作者:行者123 更新时间:2023-11-30 16:41:00 25 4
gpt4 key购买 nike

我已经阅读了一些关于类似主题的帖子,但似乎没有任何内容可以回答这个问题。我的数据库有关于某个时间的以下信息

  • 星期几(0-6 之间的数字)
  • 时间(用户本地时间午夜后的毫秒数)
  • UTC 偏移量(与 UTC 不同的小时数)
  • DST Observed( bool 值,说明是否在该时区观察到 DST)

此数据表示营业时间。所以每天都有时间。我想以用户本地时间显示该时间,假设每一天都是 future

int dayOffset = availability.Day - (int)now.DayOfWeek
if (dayOffset < 0)
dayOffset += 7;

当一个时区可能正在观察夏令时而另一个时区可能正在观察夏令时但尚未观察时,我真的很难理解时区和处理问题。我目前的主要问题是我认为我需要为非本地时间创建一个DateTimeOffset 对象,但我不知道该怎么做,因为我不知道不知道夏令时是否生效。我希望我说清楚了。使用日期和时间确实是一种令人费解的体验!

最佳答案

如其他答案所示,跨时区处理 DateTime 的通常解决方案是存储 UTC 时间。

但是,考虑到您不是在引用特定日期的绝对时间,而是在引用特定时区中无限天数的时间;将时间存储为 UTC 时间不再有意义,因为由于 DST,UTC 时间(即使我们丢弃日期)也会因日期而异。

存储时间的最佳方式与您已经完成的方式相当接近。

您的问题是您目前存储的时区信息不明确,因为它不是指特定时区,而是指属性时区。

要解决这个问题,只需存储时区标识符而不是 UTC 偏移量和 DST bool 值。

现在我们可以构建DateTime 对象并使用TimeZoneInfo class 将其转换为任何时区。 :

int dayOffset = availability.Day - (int)DateTime.Today.DayOfWeek;
if (dayOffset < 0)
{
dayOffset += 7;
}

var openingHourStart = DateTime
.SpecifyKind(DateTime.Today, DateTimeKind.Unspecified)
.AddDays(dayOffset)
.AddMilliseconds(availability.Time);

var sourceTimeZone = TimeZoneInfo.FindSystemTimeZoneById(availability.TimeZoneId);
var userTimeZone = TimeZoneInfo.Local;

var convertedOpeningHourStart = TimeZoneInfo.ConvertTime(openingHourStart,
sourceTimeZone,
userTimeZone);

关于c# - 在C#中将时间数据转换为本地时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50041085/

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