我想将TimeZone指定为GMT但是创建一个本地的DateTime(EST);

时间:2015-03-24 15:54:14

标签: c# datetime timezone

我想在GMT时区指定一个时间,然后将其转换为本地TimeZone,即EST。

这似乎做了我想做的事,但似乎还有很长的路要走!

是否有更简单的方法来实现这一目标:

public static TimeZoneInfo edtZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
    public static TimeZoneInfo gmtZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
    public static CultureInfo ci = CultureInfo.InvariantCulture;

 DateTime edtStartDT = TimeZoneInfo.ConvertTime(DateTime.SpecifyKind(DateTime.Now.Date.Add(new TimeSpan(18, 00, 00)), DateTimeKind.Unspecified), gmtZone, edtZone);

1 个答案:

答案 0 :(得分:0)

可能你在寻找什么:

// A timespan isn't really a time-of-day, but we'll let that slide for now.
TimeSpan time = new TimeSpan(18, 00, 00);

// Use the current utc date, at that time.
DateTime utcDateTime = DateTime.UtcNow.Date.Add(time);

// Convert to the US Eastern time zone.
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime easternDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, tz);

请注意,我们会将当前的UTC日期与您提供的时间配对。由于美国东部时间比UTC晚5或4小时,因此18:00您将始终获得相同的日期。但是如果你使用不同的时间,例如00:00,你会发现产生的东部时间是在之前的日。这很正常。

关于您之前代码的几点说明:

  • Windows时区ID "Eastern Standard Time"指的是两者 EST和EDT。它应该被称为"东部时间"。不要让这个名字混淆这个问题。

  • 对于所有现代用途,GMT和UTC大致相同。除非您指的是伦敦使用的时区,否则您应该更喜欢UTC。

  • Windows时区ID "GMT Standard Time"实际上不适用于GMT / UTC。它特别是在伦敦使用的时区,在GMT(UTC + 00:00)和BST(UTC + 01:00)之间交替。如果您希望TimeZoneInfo表示UTC,则ID仅为" UTC"。 (但是,在这种情况下,你并不需要这样做。)

  • 您的原始代码假设使用了DateTime.Now.Date,它假设计算机的本地时区中的日期 - 可能不是 UTC或Eastern。 / p>

  • 如果您发现自己使用DateTime.SpecifyKind,在大多数情况下,您可能会做错事。 (例外情况是加载或反序列化时。)

关于我关于TimeSpan不是真正的时间的说明,这就是.NET如何处理它:

DateTime time = DateTime.Parse("18:00:00", CultureInfo.InvariantCulture);
DateTime utcDateTime = DateTime.UtcNow.Date.Add(time.TimeOfDay);

甚至在一行中更丑陋:

DateTime utcDateTime = DateTime.Parse("18:00:00", CultureInfo.InvariantCulture,
    DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal);

就个人而言,我宁愿使用Noda Time,它明确地为一个时间段明确指定LocalTime类型,但不限于特定日期。我还努力获得System.TimeOfDateSystem.Date类型added to the CoreCLR