我有四个整数:
- 一月中的某一天(1 - 31)
- 一年中的月份(1 - 12)
- 年份
- 一天中的某个时间(0 - 23)
这些整数代表我的网页上的用户选择的日期和时间。他们可能在地球上的任何地方。
值得庆幸的是,我有他们在地球上位置的 GMT 偏移量。这是一个小数。
如何获取这四个整数,加上 GMT 偏移小数,并获得表示它们的 UTC 格式的 DateTime
?
要回答这个问题,请填写该函数的方法主体:
公共(public)静态DateTime UtcDateTime(int日,int月,int年,int小时,小数gmtOffset){ //去做 }
最佳答案
我建议将 DateTime
与 TimeZoneInfo 结合使用。 。您可以在服务器上存储 UTC 时间,并使用每个用户自己的 TimeZoneInfo
为每个用户转换时间。 TimeZoneInfo
可以由用户设置,或者如果可能的话,您可以以某种方式从 Windows
设置中提取它。我们要求用户在其设置页面上设置TimeZoneInfo
(通过下拉列表)。
更新
虽然 Microsoft 在 MSDN 中声明我们应该使用 DateTimeOffset
而不是 DateTime
,但使用 DateTimeOffset
仍存在一些问题。我尝试序列化/反序列化通过 WCF 传输的 DataTimeOffset 实例失败。 DateTime/TimeZoneInfo 工作正常。我非常喜欢 DateTimeOffset,但在某些方面它仍然不适合实际应用程序。
DateTimeOffset 的另一个缺点是它不包含转换时间所需的所有信息,因为它只包含一个偏移量。但可能有多个具有相同偏移量的实际时区,因此您无法仅根据偏移量恢复时区。时区不仅仅是一个偏移量,它是定义时间转换、冬夏令时等的一组规则
更新
你在这里:
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;
}
关于.NET:从具有 GMT 偏移量的日期获取 UTC 日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5697307/