如何仅在 TimezoneInfo.ConvertTime C# 中使用标准时间
How to use Standard Time Only in TimezoneInfo.ConvertTime C#
我对 TimeZoneInfo.ConvertTime() 的 C# 函数有疑问。
我需要得到的是标准时间而不是夏令时,但我只得到夏令时有没有办法告诉函数只在标准时间得到结果。
我当地的时区是 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;
}
谢谢
几件事:
ID "Eastern Standard Time"
代表 EST 和 EDT,并进行适当的转换。将其称为 "Eastern Time" 更合适,但遗憾的是,这是 Windows 时区使用的标识符和约定。
东部时区确实确实转换夏令时。如果你总是调整到东部标准时间 (UTC-5),你将忽略该地区计时的现实——夏季月份的日期是东部夏令时 (UTC-4)。
您的代码确实 return 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;
如果你真的想要东部时区的当前时间,并在适当的时候考虑夏令时,那么:
DateTime dt = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.UtcNow,
"Eastern Standard Time");
我对 TimeZoneInfo.ConvertTime() 的 C# 函数有疑问。
我需要得到的是标准时间而不是夏令时,但我只得到夏令时有没有办法告诉函数只在标准时间得到结果。
我当地的时区是 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;
}
谢谢
几件事:
ID
"Eastern Standard Time"
代表 EST 和 EDT,并进行适当的转换。将其称为 "Eastern Time" 更合适,但遗憾的是,这是 Windows 时区使用的标识符和约定。东部时区确实确实转换夏令时。如果你总是调整到东部标准时间 (UTC-5),你将忽略该地区计时的现实——夏季月份的日期是东部夏令时 (UTC-4)。
您的代码确实 return 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;
如果你真的想要东部时区的当前时间,并在适当的时候考虑夏令时,那么:
DateTime dt = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.UtcNow,
"Eastern Standard Time");