我有一个问题与TimeZoneInfo.ConvertTime()的c#函数。
我需要得到的是标准时间,而不是夏令时,但我只得到夏令时,有没有办法告诉函数只得到标准时间的结果。
我的本地时区是UTC -6:00中美洲标准时间,所以如果我的时间是12:00 PM,我得到的转换是在东部时间下午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;
}
谢谢
以下几点:
-
ID
"Eastern Standard Time"
代表EST和EDT,并有适当的转换。它应该被称为"东部时间"更合适,但是唉,这是Windows时区使用的标识符和约定。 -
东部时区确实在夏令时和夏令时之间进行了转换。如果你总是调整到东部标准时间(UTC-5),你就会忽略该地区的计时现实-夏季月份的日期是东部夏令时(UTC-4)。
-
你的代码确实会返回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");