我遇到了TimeZoneInfo.ConvertTime()的C#函数问题。
我需要得到的是标准时间而不是DST,但我只是得到DST有一种方法告诉函数只能在标准时间内获得结果。
我的本地时区是UTC -6:00中美洲标准时间,所以如果我的时间是中午12:00,我得到的转换是在美国东部时间下午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;
}
由于
答案 0 :(得分:0)
有几件事:
ID unsigned char
代表EST和EDT,并具有适当的转换。它更适合称为“东部时间”,但这是Windows时区使用的标识符和约定。
东部时区真的 过渡到夏令时。如果你总是调整到东部标准时间(UTC-5),那么你将忽略该地区计时的现实 - 它是在东部夏令时(UTC-4)的夏季日期。
您的代码确实会返回EST,但仅适用于DST期间之外的日期值。
现在,如果仍然认为这是您想要做的事情 - 那么您可以在没有"Eastern Standard Time"
对象的情况下完成此操作。只需将适用于您的源值的偏移量的结果调整为适用于EST的UTC-5偏移量。
TimeZoneInfo
这就是你的要求,但是为了记录 - 我认为这不是最好的计划。除了上面的问题 - 假设输入值应该根据本地时区解释不一定是个好主意 - 除非输入时间有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
如果你真的想要在东部时区的当前时间,在适当的时候考虑DST,那么:
DateTime dt = DateTimeOffset.UtcNow.ToOffset(TimeSpan.FromHours(-5)).DateTime;