我有四个整数:
这些整数表示我的网页上的用户选择的日期和时间。他们可能在世界的任何地方。
谢天谢地,我在地球上的位置有GMT偏移量。这是一个小数。
如何获取这四个整数,加上GMT偏移小数,并在UTC中获得代表它们的DateTime
?
要回答此问题,请填写此功能的方法正文:
public static DateTime UtcDateTime(int day,int month,int year,int hour,decimal gmtOffset){ // 去做 }
答案 0 :(得分:3)
我建议将DateTime
与TimeZoneInfo结合使用。您可以在服务器上存储UTC时间,并使用自己的TimeZoneInfo
将时间转换为每个用户。 TimeZoneInfo
可以由用户设置,或者如果可能,您可以以某种方式从Windows
设置中提取它。我们要求用户在其设置页面上设置TimeZoneInfo
(通过下拉列表)。
<强>更新强>
虽然Microsoft在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 :(得分:1)
您应该使用DateTimeOffset。
将小数转换为您需要的精度,然后如下构造(使用FromSeconds作为示例):
new DateTimeOffset(年,月,日,小时,0,0,TimeSpan.FromSeconds(offset));
http://msdn.microsoft.com/en-us/library/system.datetimeoffset(v=VS.90).aspx