如何仅在 TimezoneInfo.ConvertTime C# 中使用标准时间

How to use Standard Time Only in TimezoneInfo.ConvertTime C#

我对 TimeZoneInfo.ConvertTime() 的 C# 函数有疑问。

我需要得到的是标准时间而不是夏令时,但我只得到夏令时有没有办法告诉函数只在标准时间得到结果。

我当地的时区是 UTC -6:00 中美洲标准时间,所以如果我的时间是 12:00 下午,我得到的转换是在东部时间下午 2 点扔掉它,但我需要它来告诉我是 1:00 下午。

public static DateTime TimetoEst( DateTime timenow)
    {
        var currentTimeZone = TimeZone.CurrentTimeZone.GetUtcOffset(timenow).ToString();
        var estzone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
        var conver = TimeZoneInfo.ConvertTime(timenow, estzone);

        return conver;


    }

谢谢

几件事:

  • ID "Eastern Standard Time" 代表 EST 和 EDT,并进行适当的转换。将其称为 "Eastern Time" 更合适,但遗憾的是,这是 Windows 时区使用的标识符和约定。

  • 东部时区确实确实转换夏令时。如果你总是调整到东部标准时间 (UTC-5),你将忽略该地区计时的现实——夏季月份的日期是东部夏令时 (UTC-4)。

  • 您的代码确实 return EST,但仅适用于 DST 期间之外的日期值。

现在,如果您仍然认为这是您想要做的 - 那么您完全可以在没有 TimeZoneInfo 对象的情况下完成。只需将适用于您的源值的偏移量的结果调整为适用于 EST 的 UTC-5 偏移量。

public static DateTime TimetoEst(DateTime timenow)
{
    var dto = new DateTimeOffset(timenow);  // will use .Kind to decide the offset
    var converted = dto.ToOffset(TimeSpan.FromHours(-5));
    return converted.DateTime;
}

这就是您的要求,但郑重声明 - 我认为这不是最好的计划。除了上述问题 - 假设输入值应该根据本地时区来解释不一定是个好主意 - 除非输入时间的 .KindDateTimeKind.Utc,否则它确实会使用计算机的本地时区。

您确实将变量标记为 timenow。如果您刚好在 DateTime 之后,它代表固定偏移量中的当前时间,那么像这样获取它会更安全:

DateTime dt = DateTimeOffset.UtcNow.ToOffset(TimeSpan.FromHours(-5)).DateTime;

如果你真的想要东部时区的当前时间,并在适当的时候考虑夏令时,那么:

DateTime dt = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.UtcNow,
                                                         "Eastern Standard Time");