我会建议结合使用DateTime
与TimeZoneInfo。您可以在您的服务器上存储UTC时间,并使用他自己的TimeZoneInfo
将时间转换为每个用户。 TimeZoneInfo
可以由用户设置,或者您可以以某种方式从Windows
设置中提取它(如果可能的话)。我们要求用户在其设置页面上设置TimeZoneInfo
(通过下拉列表)。
更新
虽然在MSDN微软指出,我们应该使用DateTimeOffset
而不是DateTime
有使用DateTimeOffset
一些问题。我试图序列化/反序列化通过WCF传输它们的DataTimeOffset实例失败。和DateTime/TimeZoneInfo工作正常。我很喜欢DateTimeOffset,但它在某些方面仍然不适合真实应用。
另一个DateTimeOffset的缺点是它不包含所有需要转换时间的信息,因为它只包含一个偏移量。但是可能有几个具有相同偏移量的实际时区,因此只有给定偏移量才能恢复时区。时区不仅仅是一个偏移量,它是定义时间转换的一组规则,冬季/夏季时间e.t.c.
更新
给你:
private static DateTime ToUTC(int day, int month, int year, int hour, decimal utcOffset)
{
TimeSpan offset = TimeSpan.FromMinutes((double)(utcOffset * 60)); // time zone offset is always aligned to minutes
return new DateTimeOffset(year, month, day, hour, 0, 0, offset).ToUniversalTime().DateTime;
}
鉴于世界上一些时区是在1个小时的分数增加的,不知道在一小时内的分钟,你不能准确拿出每小时UTC表示它们。 – Joe 2011-04-18 00:11:46
你是否考虑夏令时? – David 2011-04-18 00:27:44
@Joe:嗯?时间是分数。我有十进制的GMT。 x /(60 * 60)= GMT偏移分数/(100 * 60),其中'x'是秒。 – DotNetDateQuestion 2011-04-18 01:04:15