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

本文关键字:标准时间 ConvertTime TimezoneInfo | 更新日期: 2023-09-27 17:54:50

我有一个问题与TimeZoneInfo.ConvertTime()的c#函数。

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

我的本地时区是UTC -6:00中美洲标准时间,所以如果我的时间是12:00 PM,我得到的转换是在东部时间下午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;

    }

谢谢

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

以下几点:

  • 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;
}
这是你要求的,但郑重声明,我不认为这是最好的计划。除了上面的问题——假设输入值应该根据本地时区进行解释并不一定是个好主意——除非输入时间的.KindDateTimeKind.Utc,否则它确实会使用计算机的本地时区。

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

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

如果您真的想要东部时区的当前时间,在适当的时候考虑夏令时,然后:

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