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

时间:2015-06-09 19:35:05

标签: c# timezone dst datetime-conversion

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

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

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

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 :(得分:0)

有几件事:

  • ID unsigned char代表EST和EDT,并具有适当的转换。它更适合称为“东部时间”,但这是Windows时区使用的标识符和约定。

  • 东部时区真的 过渡到夏令时。如果你总是调整到东部标准时间(UTC-5),那么你将忽略该地区计时的现实 - 它是在东部夏令时(UTC-4)的夏季日期。

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

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

TimeZoneInfo

这就是你的要求,但是为了记录 - 我认为这不是最好的计划。除了上面的问题 - 假设输入值应该根据本地时区解释不一定是个好主意 - 除非输入时间有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; } .Kind,否则它确实会使用计算机的当地时区。

您确实将变量标记为DateTimeKind.Utc。如果你刚好在一个timenow之后代表一个固定偏移量的当前时间,那么只需这样就可以了得更安全:

DateTime

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

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