C# 考虑到夏令时,从一个时区转换到另一个时区
我想将日期时间从一个时区转换为另一个时区。为此,我需要将区域id传递给FindSystemTimeZoneById方法。但我没有这些信息,需要通过使用开关盒来确定。C# 考虑到夏令时,从一个时区转换到另一个时区,c#,timezone,dst,C#,Timezone,Dst,我想将日期时间从一个时区转换为另一个时区。为此,我需要将区域id传递给FindSystemTimeZoneById方法。但我没有这些信息,需要通过使用开关盒来确定。 这里我还需要考虑夏令时。但为了确定某个时间是否在DST中,我需要事先获得该区域id。 是否有任何方法可以确定某个时间是否在没有区域id的DST中。我的服务器位于区域1,我想将该时间转换为区域2 以下是片段: public DateTime ConvertToDestTime(DateTime currentTime, string
这里我还需要考虑夏令时。但为了确定某个时间是否在DST中,我需要事先获得该区域id。
是否有任何方法可以确定某个时间是否在没有区域id的DST中。我的服务器位于区域1,我想将该时间转换为区域2 以下是片段:
public DateTime ConvertToDestTime(DateTime currentTime, string sourceTimeZoneUtc, string serverTimeZoneUtc)
{
TimeZoneInfo sourceTimeZone = TimeZoneInfo.FindSystemTimeZoneById(ReturnTimeZoneString(sourceTimeZoneUtc));
TimeZoneInfo serverTimeZone = TimeZoneInfo.FindSystemTimeZoneById(ReturnTimeZoneString(serverTimeZoneUtc));
DateTime serverTime = TimeZoneInfo.ConvertTime(currentTime, sourceTimeZone, serverTimeZone);
return serverTime;
}
private string ReturnTimeZone(string utcOffset)
{
string timezone = string.Empty;
string isDaylight = //need to determine whether time is in DST here
if (isDaylight == "N")
{
switch (utcOffset)
{
case "-04:00":
timezone = "Atlantic Standard Time";
break;
case "-05:00":
timezone = "Eastern Standard Time";
break;
}
}
else
{
switch (utcOffset)
{
case "-04:00":
timezone = "Eastern Standard Time";
break;
case "-05:00":
timezone = "Central America Standard Time";
break;
}
}
return timezone;
查看Microsoft的“永恒”文章
这篇文章可能已经有几年的历史了,但原则和问题场景仍然是今天的主题
有专门的一章是关于
将您的本地时间视图转换为世界时间
执行您的计算,您就可以解决时间问题
准确
因此,请先将本地时间转换为UTC格式,然后再转换为目标时间格式。您无法可靠地执行此类反向映射。任何特定的偏移量都有可能落入两个或多个时区
- 请参阅中的“时区!=偏移”
- 另见
- 最后,要认识到,由于北美的每个时区都会回到各自的本地时间,因此两个时区同时共享一些值
例如,
可能属于美国中部时间(CDT)或美国东部时间(EST)2014-11-02T01:00:00-05:00
string sourceTimeZone="Atlantic Standard Time;
TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(sourceTimeZone);
DateTime sourceUTCTime = TimeZoneInfo.ConvertTimeToUtc(currentTime, timeZoneInfo);
然后使用转换后的UTC时间获得目标时间,如下所示
string destinationTimeZone="India Standard Time";
TimeZoneInfo destTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(destinationTimeZone);
DateTime destinationUTCTime = TimeZoneInfo.ConvertTimeFromUtc(sourceUTCTime, destTimeZoneInfo);
希望这有帮助 看看Jon Skeet的,别担心了:)默认日期支持对于大多数应用程序来说已经足够好了,但是一旦你开始跨越时区,它可能会有点棘手。你在
currentTime
中有什么价值?(它的种类
属性返回了什么?)。此字段的值类似于“7/13/2014 12:00:00 AM”,TimeZoneInfo应该只为您处理DST。不过,将时区指定为UTC偏移量通常是一个非常糟糕的主意。