0

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

我需要得到的是标准时间而不是 DST,但我只得到 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;


    }

谢谢

4

1 回答 1

0

有几件事:

  • ID"Eastern Standard Time"代表 EST 和 EDT,并具有适当的转换。它更适合称为“东部时间”,但可惜这是 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;
}

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

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

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

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

DateTime dt = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.UtcNow,
                                                         "Eastern Standard Time");
于 2015-06-09T23:49:59.740 回答