我正在数据库中以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指本地时区中的,而不是任何其他时区。这就是你出错的原因