【问题标题】:How to get UTC time based on a DateTime and a TimeZone Offset?如何根据 DateTime 和 TimeZone Offset 获取 UTC 时间?
【发布时间】:2014-09-29 21:28:19
【问题描述】:

我有一个日期时间对象,并且我知道 UTC 偏移量(双精度)。如何从这两条信息中获取 UTC 时间?

我见过的所有示例都需要时区。好吧,我不知道时区是什么,这并不重要。如果我的偏移量为 -7,它可能是 PDT,也可能是 MST - 这真的无关紧要,因为两者都会产生相同的 UTC。我必须将必须的偏移量转换为时区,这样“ToUniversalTime”才能将偏移量拉回,这似乎真的很愚蠢。

老实说,我打算只使用这样的东西:

DateTime dateTime = new DateTime(2014, 8, 6, 12, 0, 0);
Double timeZone = -7.0;
string utc = String.Format("{0}-{1}-{2}T{3}:{4}:{5}{6}:{7}", startDate.Year, startDate.Month, startDate.Day, startDate.Hour, startDate.Minute, startDate.Second, (int) Math.Floor(timeZone), (timeZone % 1) * 60);

谁能告诉我为什么这是个坏主意?

(有人可能会将此作为重复项关闭,但我查看了其他十几个问题,但没有一个完全相同 - 它们都使用了 TimeZoneInfo 对象)。

【问题讨论】:

  • 为什么不DateTime.AddHours+ TimeSpan ?旁注:有“30 分钟”时区,所以要小心你的小时四舍五入。
  • 因为我需要将其转换为 UTC 时间,并且这样做时它使用我的本地时区,而不是我提供的时区。我想我可以做一些减法并减去或添加本地时区和所需时区之间的差异,然后将其转换为 UTC ......但这似乎仍然没有必要。
  • 这感觉像是一个 XY 问题。请提供更多有关您要完成的工作的背景信息。你实际上需要它作为一个字符串,还是你在寻找其他东西?
  • 请注意节省时间的问题,特别是如果您对偏移量进行硬编码!

标签: c# datetime timezone utc


【解决方案1】:

只需使用DateTimeOffset:

TimeSpan utcOffset = TimeSpan.FromHours(timeZone);
DateTimeOffset result = new DateTimeOffset(dateTime, utcOffset);
DateTime utc = result.UtcDateTime;

string utc = result.ToString("yyyy-MM-dd'T'HH:mm:ssK", CultureInfo.InvariantCulture);

不清楚为什么你希望它最后作为一个字符串......

(您可能还想考虑使用我的 Noda Time 项目,特别是因为您可能会看到 TZDB 时区的时区 ID...)

【讨论】:

    猜你喜欢
    • 2012-01-07
    • 2011-09-29
    • 1970-01-01
    • 2018-04-09
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多