繁体   English   中英

.NET:使用GMT偏移从日期获取UTC DateTime

[英].NET: Getting UTC DateTime from date with GMT offset

我有四个整数:

  • 每月的日子(1 - 31)
  • 一年中的一个月(1 - 12)
  • 一天中的小时(0-23)

这些整数表示我的网页上的用户选择的日期和时间。 他们可能在地球上的任何地方。

值得庆幸的是,我在地球上的位置有GMT偏移量。 这是一个小数。

如何获取这四个整数,加上GMT偏移小数,并获得代表它们的UTC DateTime时间?

要回答这个问题,请填写此函数的方法体:

public static DateTime UtcDateTime(int day,int month,int year,int hour,decimal gmtOffset){// todo}

我建议将DateTimeTimeZoneInfo结合使用。 您可以在服务器上存储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;
}

您应该使用DateTimeOffset。

将小数转换为您需要的精度,然后如下构造(使用FromSeconds作为示例):

new DateTimeOffset(year,month,day,hour,0,0,TimeSpan.FromSeconds(offset));

http://msdn.microsoft.com/en-us/library/system.datetimeoffset(v=VS.90).aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM