如何使用 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;
}
我有一个 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;
}