如何使用 C# 在 Linux Ubantu 中考虑夏令时

How to consider Daylight Saving Time in Linux Ubantu using C#

我有一个 C# 程序需要将 EST 转换为 UTC。以下功能在 Linux 中完美运行,除了它增加了一个小时的额外意味着而不是增加 4 小时,它增加了 5 小时。这是因为夏令时。

我试过

TimeZoneInfo.Local.IsDaylightSavingTime()

但它在 Linux 中返回了错误的值 Ubuntu -- 它应该是 true 但返回的是 false。

如何解决 Linux 中的这个问题?

private DateTime ConvertToUTCHHmm(DateTime dateValue)
        {
            // default to date for debuging, should be overwritten
            DateTime dateTimeUtc = DateTime.Now.AddYears(-120);

            try
            {
                // Convert EST to UTC - Old Method of conversion.
                TimeZoneInfo est = TimeZoneInfo.FindSystemTimeZoneById("America/New_York");
                
                dateTimeUtc = TimeZoneInfo.ConvertTimeToUtc(dateValue, est);
                // Check Daylight Saving Time..
                DateTime thisTime = DateTime.Now;
                bool isDaylight = TimeZoneInfo.Local.IsDaylightSavingTime(thisTime);
                _logger.LogDebug(String.Format(" IsDaylightSavingTime : {0}", isDaylight));
                if (isDaylight) // returns as false. It supposed to be true
                    dateTimeUtc = dateTimeUtc.AddHours(-1);
                _logger.LogDebug(String.Format("TimeZoneInfo Old Process : {0} Converted Time : {1}", est, dateTimeUtc));
            }
            catch (Exception ex)
            {
                _logger.LogError("TimeZoneInfo Old Process Error - " + ex.Message);
            }

            return dateTimeUtc;
        }

我们终于解决了这个问题。此行有问题 -

bool isDaylight = TimeZoneInfo.Local.IsDaylightSavingTime(thisTime);

我们无法通过本地获取纽约时区,因为服务器是 运行 的 UTC。所以我们不得不更改代码以获取纽约时区,并且一切正常。

TimeZoneInfo tst = TimeZoneInfo.FindSystemTimeZoneById("America/New_York");

这是完整的方法。

private DateTime ConvertToUTCHHmm(DateTime dateValue)
        {
            // default to date for debuging, should be overwritten
            DateTime dateTimeUtc = DateTime.Now.AddYears(-120);

            try
            {
                // Convert EST to UTC - Old Method of conversion.
                TimeZoneInfo est = TimeZoneInfo.FindSystemTimeZoneById("America/New_York");
                dateTimeUtc = TimeZoneInfo.ConvertTimeToUtc(dateValue, est);
                // Check Daylight Saving Time..
                DateTime thisTime = DateTime.Now;
                TimeZoneInfo tst = TimeZoneInfo.FindSystemTimeZoneById("America/New_York");
                bool isDaylight = tst.IsDaylightSavingTime(thisTime);
                _logger.LogDebug(String.Format(" IsDaylightSavingTime : {0}", isDaylight));
                if (isDaylight)
                    dateTimeUtc = dateTimeUtc.AddHours(-1);
                _logger.LogDebug(String.Format("TimeZoneInfo Old Process : {0} Converted Time : {1}", est, dateTimeUtc));
            }
            catch (Exception ex)
            {
                _logger.LogError("TimeZoneInfo Old Process Error - " + ex.Message);
            }

            return dateTimeUtc;
        }