将日期时间转换为UTC时遇到问题

我正在数据库中以UTC格式存储我的所有日期。我向用户询问他们的时区,我想使用他们的时区加上我猜测的服务器时间来计算他们的UTC

一旦我有了这些数据,我想使用新转换的UTC日期进行搜索,以查看数据库中的范围

但我总是得到这个例外

用户代码未处理System.ArgumentException
消息="转换无法完成,因为
提供的DateTime未正确设置种类属性。
例如,当种类属性为DateTimeKind.Local时,
源时区必须是TimeZoneInfo.Local。
参数名称:sourceTimeZone"

我不知道为什么我会得到这个

我试了两种方法

TimeZoneInfo zone=TimeZoneInfo.FindSystemTimeZoneById(id);
//我也试过DateTime.UtcNow
DateTime now=DateTime.SpecifyKind(DateTime.now,DateTimeKind.Local);
var utc=TimeZoneInfo.ConvertTimeToUtc(现在,区域);

这失败了,所以我尝试了

DateTime now=DateTime.SpecifyKind(DateTime.now,DateTimeKind.Local);
var utc=TimeZoneInfo.ConvertTimeBySystemTimeZoneId(现在,
时区Id、TimeZoneInfo.Utc.Id);

这也失败了,出现了相同的错误。我做错了什么

这行吗

DateTime localServerTime=DateTime.SpecifyKind(DateTime.Now,DateTimeKind.Local);
TimeZoneInfo info=TimeZoneInfo.FindSystemTimeZoneById(id);
var usersTime=TimeZoneInfo.ConvertTime(localServerTime,info);
var utc=TimeZoneInfo.ConvertTimeToUtc(usersTime,userInfo);

编辑[email protected] Skeet

是的,我只是在想我甚至不需要做这些。时间的东西让我现在很困惑,所以这就是为什么这篇文章可能没有它应有的清晰。我从来都不知道什么是该死的日期时间。现在是(我试图改变我的时区到另一个时区,它一直得到我的本地时间)

这就是我想要实现的:用户来到站点,添加一些警报,并将其保存为utc(之前是DateTime。现在,有人建议存储utc的所有内容)

因此,在用户访问我的站点之前,根据我的托管服务器的位置,可能是第二天。因此,如果说警报在8月30日(他们的时间)显示,但由于服务器的时差,他们可能在8月29日出现,警报将显示

所以我想解决这个问题。所以现在我不确定我是否应该存储他们的本地时间,然后使用这个偏移量?或者只存储UTC时间。仅存储UTC时间可能仍然是错误的,因为用户可能仍然在考虑本地时间,我不确定UTC是如何工作的。它仍然可能在不同的时间结束

编辑3

var info=TimeZoneInfo.FindSystemTimeZoneById(id)
DateTimeOffset usersTime=TimeZoneInfo.ConvertTime(DatabaseOutcDate,
时区信息(Utc,信息);

您需要将种类设置为未指定,如下所示:

DateTime now=DateTime.SpecifyKind(DateTime.now,DateTimeKind.Unspecified);
var utc=TimeZoneInfo.ConvertTimeToUtc(现在,区域);

DateTimeKind.Local指本地时区中的,而不是任何其他时区。这就是你出错的原因

发表评论