C# 我想将时区指定为GMT,但创建一个本地的日期时间(EST);

C# 我想将时区指定为GMT,但创建一个本地的日期时间(EST);,c#,datetime,timezone,C#,Datetime,Timezone,我想在GMT时区中指定一个时间,然后将其转换为本地时区,即EST 这似乎是我想要做的,但似乎要走很长的路 有没有更简单的方法来实现这一点: public static TimeZoneInfo edtZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); public static TimeZoneInfo gmtZone = TimeZoneInfo.FindSystemTimeZoneById("GMT

我想在GMT时区中指定一个时间,然后将其转换为本地时区,即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);
这可能就是您正在寻找的:

// 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东部标准时间指东部标准时间和东部标准时间。它真的应该被称为东部时间。不要让名称混淆问题

GMT和UTC在所有现代用法中基本相同。除非您指的是伦敦使用的时区,否则您应该更喜欢UTC这一术语

Windows时区ID GMT标准时间实际上不是GMT/UTC。特别是伦敦使用的时区,在GMT UTC+00:00和BST UTC+01:00之间交替。如果需要表示UTC的时区信息,则ID仅为UTC。但是,在这种情况下,您并不真正需要它

您的原始代码假定已使用DateTime.Now.Date,它将假定计算机本地时区中的日期-可能不是UTC或Eastern

如果您发现自己在使用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);

就我个人而言,我更愿意使用,它有一个单独的LocalTime类型,用于一天中不绑定到特定日期的时间。我还在努力获取System.TimeOfDate和System.Date类型。

可以将指定的时间进行偏移,而不必担心一天中的某个时间。但通过观看您自己的PluralSight训练和在NodaTime上阅读,我只想指出,GMT与UTC不同。我从你那里学到的。我只是猜测,当OP说GMT时,你是在猜测他指的是UTC,但如果他没有,那么你的答案是错误的。@RickDavin-hmm。。。我想你可能误解了,因为我记得在PS课程中说过,GMT和UTC基本上是相同的,除了它们是如何被法律定义的以及它们是如何起源于历史的。很高兴看到你观看了见:给出了一个很好的答案,但问题澄清可能会有所帮助:A你真的是指GMT还是UTC?你是明确地想要东部标准时间,还是你真的想要恰好是东部的当地时间?如果你在芝加哥运行这个,你还想使用东部还是中部?