Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 考虑到夏令时,从一个时区转换到另一个时区_C#_Timezone_Dst - Fatal编程技术网

C# 考虑到夏令时,从一个时区转换到另一个时区

C# 考虑到夏令时,从一个时区转换到另一个时区,c#,timezone,dst,C#,Timezone,Dst,我想将日期时间从一个时区转换为另一个时区。为此,我需要将区域id传递给FindSystemTimeZoneById方法。但我没有这些信息,需要通过使用开关盒来确定。 这里我还需要考虑夏令时。但为了确定某个时间是否在DST中,我需要事先获得该区域id。 是否有任何方法可以确定某个时间是否在没有区域id的DST中。我的服务器位于区域1,我想将该时间转换为区域2 以下是片段: public DateTime ConvertToDestTime(DateTime currentTime, string

我想将日期时间从一个时区转换为另一个时区。为此,我需要将区域id传递给FindSystemTimeZoneById方法。但我没有这些信息,需要通过使用开关盒来确定。
这里我还需要考虑夏令时。但为了确定某个时间是否在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格式,然后再转换为目标时间格式。

您无法可靠地执行此类反向映射。任何特定的偏移量都有可能落入两个或多个时区

  • 请参阅中的“时区!=偏移”

  • 另见

  • 最后,要认识到,由于北美的每个时区都会回到各自的本地时间,因此两个时区同时共享一些值

    例如,
    2014-11-02T01:00:00-05:00
    可能属于美国中部时间(CDT)或美国东部时间(EST)


将源时间转换为UTC时间

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偏移量通常是一个非常糟糕的主意。