【问题标题】:.NET: Getting UTC DateTime from date with GMT offset.NET:从具有 GMT 偏移量的日期获取 UTC DateTime
【发布时间】:2011-04-17 23:57:23
【问题描述】:

我有四个整数:

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

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

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

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

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

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

【问题讨论】:

  • 鉴于世界上的某些时区以 1 小时为增量,在不知道一小时内的分钟数的情况下,您无法准确地得出每小时 UTC 来表示它们。
  • 您是否考虑了夏令时?
  • @Joe:嗯?时间是分数。我有十进制的格林尼治标准时间。 x/(60 * 60) = GMT 偏移分数/(100 * 60),其中x 是秒。
  • 是的,但你说你只有:日、月、年和小时。如果没有分钟数,您应该如何表示当前日期和时间?如果不知道当前的分钟数,您将无法知道要调整到哪个小时。

标签: .net datetime localization date


【解决方案1】:

我建议将DateTimeTimeZoneInfo 结合使用。您可以将 UTC 时间存储在您的服务器上,并使用他自己的TimeZoneInfo 将时间转换为每个用户。 TimeZoneInfo 可以由用户设置,或者如果可能的话,您可以以某种方式从Windows 设置中提取它。我们要求用户在他们的设置页面上设置他们的TimeZoneInfo(通过下拉列表)。

更新

虽然微软在 MSDN 中声明我们应该使用 DateTimeOffset 而不是 DateTime,但使用 DateTimeOffset 会出现一些问题。我未能尝试序列化/反序列化 DataTimeOffset 实例,通过 WCF 传输它们。 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;
}

【讨论】:

    【解决方案2】:

    你应该使用 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      相关资源
      最近更新 更多