首页 文章

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

提问于
浏览
0

我遇到了TimeZoneInfo.ConvertTime()的C#函数问题 .

我需要得到的是标准时间而不是夏令时,但我只是得到DST有一种方法告诉功能只能在标准时间内获得结果 .

我的当地时区是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;


    }

谢谢

1 回答

  • 0

    有几件事:

    • ID "Eastern Standard Time" 表示EST和EDT,并具有适当的转换 . 它更适合称为"Eastern Time",但这是Windows时区使用的标识符和约定 .

    • 东部时区确实在夏令时期间过渡 . 如果您总是调整到东部标准时间(UTC-5),那么您将忽略该地区的计时现实 - 即夏季月份的东部夏令时(UTC-4) .

    • 您的代码确实将返回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;
    }
    

    这就是你的要求,但是为了记录 - 我不认为这是最好的计划 . 除了上面的问题 - 假设输入值应该基于本地时区解释不一定是个好主意 - 除非输入时间 DateTimeKind.UtcDateTimeKind.Utc ,否则它确实会使用计算机的本地时区 .

    您确实将变量标记为 timenow . 如果你刚好在一个 DateTime 之后,它代表一个固定偏移量的当前时间,那么就这样得到它会更安全:

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

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

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

相关问题