【问题标题】:How to consider Daylight Saving Time in Linux Ubantu using C#如何使用 C# 在 Linux Ubuntu 中考虑夏令时
【发布时间】:2021-11-07 07:08:01
【问题描述】:

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

我试过了

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;
        }

【问题讨论】:

    标签: c# asp.net linux timezone date-conversion


    【解决方案1】:

    最后我们解决了这个问题。问题出在这一行 -

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

    我们无法使用本地获取纽约时区,因为服务器在 UTC 中运行。因此,我们不得不更改代码以获取 New York TimeZone,并且一切正常。

    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;
            }
    

    【讨论】:

    • 不,这仍然是坏的。 DST 是否当前 生效并不会改变它在dateValue 时是否 生效。除了调用 ConvertTimeToUtc 之外,您不需要做任何事情 - 这应该会自动考虑夏令时。
    猜你喜欢
    • 2011-08-14
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 2012-07-03
    • 2017-11-13
    相关资源
    最近更新 更多