问题: 我需要在不同时区的特定时间在UTC上的服务器上执行任务。比如说我想在太平洋时间上午9点执行,而不管日期光线的变化。
我有什么? 我通过
检查了时区的枚举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
这样的框架知道如何才能让它发挥作用吗?
答案 0 :(得分:6)
您已经使用TimeZoneInfo.GetUtcOffset
得到了答案,并且使用DateTime
传递DateTimeKind.Utc
即可。
我得到-07:00:00作为输出,但到目前为止偏移是-08。这意味着它不会考虑日光变化。
实际上,-7确实是当前的偏移量,因为太平洋时间目前正在使用夏令时。在冬季,偏移量将恢复为-8,这是标准偏移量。我想你只是让他们倒退了。
另外,请记住Id
对象的TimeZoneInfo
属性是整个时区的标识符。其中一些是误导性的,如"Pacific Standard Time"
- 这会让你相信它只使用太平洋标准时间(PST),但实际上它代表整个北美太平洋时区 - 包括太平洋标准时间和< / em>太平洋夏令时。它将在适当的转换处相应地切换偏移。
答案 1 :(得分:2)
你可能正在寻找这样的东西:
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()
更新:清理代码