2011-04-17 77 views
3

我有四个整数:.NET:获取UTC日期时间从最新与GMT偏移

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

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

谢天谢地,我有他们在地球上位置的GMT偏移量。这是一个小数。

如何取这四个整数加上GMT偏移十进制数,然后得到一个代表UTC的DateTime代表它们?

要回答这个问题,填补了该功能的方法体:

公共静态的DateTime UtcDateTime(INT日,INT月,年整型,诠释小时,小数gmtOffset){// TODO }

+0

鉴于世界上一些时区是在1个小时的分数增加的,不知道在一小时内的分钟,你不能准确拿出每小时UTC表示它们。 – Joe 2011-04-18 00:11:46

+1

你是否考虑夏令时? – David 2011-04-18 00:27:44

+0

@Joe:嗯?时间是分数。我有十进制的GMT。 x /(60 * 60)= GMT偏移分数/(100 * 60),其中'x'是秒。 – DotNetDateQuestion 2011-04-18 01:04:15

回答

3

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