问题:我需要在UTC上的服务器上执行不同时区中特定时间的任务。例如,我想在太平洋时间上午9:00执行,而不考虑夏令储蓄的变化。
我有什么?我检查了时区的枚举
var infos = TimeZoneInfo.GetSystemTimeZones();
foreach (var info in infos)
{
Console.WriteLine(info.Id);
}例如,我只能看到太平洋时间的“太平洋标准时间”,如果我这样做,
TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time").GetUtcOffset(DateTime.UtcNow)我得到-07:00:00作为输出,但现在偏移量是-08。这意味着它不考虑日光的变化。
我计划根据上面得到的偏移量创建一个DateTime实例,这似乎不像我预期的那样有效。
而且,我不能使用像NodaTime这样的框架
知道我怎么能让它起作用吗?
发布于 2014-06-05 20:48:11
你可能在寻找这样的东西:
var chinaTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("China Standard Time"));
var pacificTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"));传递给FindSystemTimeZoneById的字符串是从TimeZoneInfo.GetSystemTimeZones()中选择的。
更新:清理代码
发布于 2014-06-05 20:56:26
您已经得到了您的答案,使用TimeZoneInfo.GetUtcOffset并向DateTime传递DateTimeKind.Utc将有效。
我得到-07:00作为输出,但现在偏移量是-08。这意味着它不考虑日光的变化。
实际上,-7确实是当前的偏移量,因为太平洋时间目前正在使用夏令时。在冬季,偏移量恢复到-8,这是标准偏移量。我想你只是把它们倒过来了。
另外,请记住,Id对象的TimeZoneInfo属性是整个时区的标识符。其中一些是误导性的,比如"Pacific Standard Time" --这会让你相信它只使用太平洋标准时间,但实际上它代表了整个北美太平洋时区--包括太平洋标准时间和太平洋夏令时。在适当的过渡阶段,它将相应地切换偏移量。
https://stackoverflow.com/questions/24069938
复制相似问题