C#从字符串读取时区并转换为本地

C#从字符串读取时区并转换为本地,c#,timezone,dynamics-crm,C#,Timezone,Dynamics Crm,我看了又看,似乎找不出完美的解决方案。因此,由于堆栈溢出是完美的,这将解决我的问题 我正在从服务器上获取System.Stringdatetimes(如果您愿意,可以使用Microsoft CRM)。它们是SQL格式的(“2010-07-23T17:14:40-04:00”)。我想以.netSystem.DateTime的形式读取它,并保留时区信息,然后将其转换为本地时间。这个过程发生在不同的时区,我很难保持同步。基本上,我从CRM服务器上获得了很多CRM记录(似乎所有的时区都有巴西时间(-4)

我看了又看,似乎找不出完美的解决方案。因此,由于堆栈溢出是完美的,这将解决我的问题

我正在从服务器上获取
System.String
datetimes(如果您愿意,可以使用Microsoft CRM)。它们是SQL格式的(“
2010-07-23T17:14:40-04:00
”)。我想以.net
System.DateTime
的形式读取它,并保留时区信息,然后将其转换为本地时间。这个过程发生在不同的时区,我很难保持同步。基本上,我从CRM服务器上获得了很多CRM记录(似乎所有的时区都有巴西时间(-4)),我想在我的配置文件中写下我看到的最新记录(所以我不会返回并获取我已经拥有的值)。不过我想在当地时间写下来。这是蒸馏水

我想获取字符串“
2010-07-23T17:14:40-04:00
”,然后运行一些代码:

System.Datetime Get_Local_DT(string val);
这将在中部时间(-6)返回“
2010-07-2315:14:40”,在东部时间(-5)返回“
2010-07-2316:14:40”。让我知道你的想法

 private DateTime Get_Local_DT(string strTimestamp, int iUTCOffset)
    {
        DateTime _dt = DateTime.MinValue;
        try
        {
            DateTime dt = DateTime.Parse(strTimestamp);
            DateTime _returnDateTime = dt.ToUniversalTime().AddHours(iUTCOffset);
            return _returnDateTime;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
        return _dt;
    }

我认为您应该使用System.DateTimeOffset类型来解决您的问题

String d = "2010-07-23T17:14:40-04:00";
DateTimeOffset dt = DateTimeOffset.Parse(d);
Console.WriteLine(dt.LocalDateTime + " " + dt.ToOffset(TimeSpan.FromHours(-2)));

您可以使用

string sqlDate = "2010-07-23T17:14:40-04:00";

DateTime dt = DateTime.Parse(sqlDate);
接下来,您可以使用以下语句对其进行格式化:

dt.ToString("yyyy-MM-dd HH:mm:ss", System.Globalization.DateTimeFormatInfo.InvariantInfo);
我尝试了以下代码:

void Main()
{
    string sqlDate = "2010-07-23T17:14:40-04:00";

    DateTime dt = DateTime.Parse(sqlDate);

    Console.WriteLine(dt.ToString("yyyy-MM-dd HH:mm:ss", System.Globalization.DateTimeFormatInfo.InvariantInfo));
}
输出:2010-07-2402:44:40


我现在在家。我希望这有帮助。

将它们另存为世界时:

   DateTime t = DateTime.Parse(str);
   t.ToUniversalTime(); // save this
然后将保存的时间显示为本地时间:

   DateTime t = DateTime.Parse(str);
   t.ToLocalTime(); // show this

始终使用通用时间,将本地视为mvc中的一个视图。

您的时间上印有巴西时间的原因是,它是附加到执行查询的用户的时区。CRM将universal存储在数据库中,过滤视图根据当前用户生成该字符串。这样,每当你在CRM中打开一个记录,你就会得到一个日期,上面有你所在时区的时间

如果您所做的只是保存日期/时间,以便稍后检查,我同意将其存储为UTC并进行UTC比较


请注意,如果使用任何ToLocalTime方法,则在服务器上显示的是本地时间,而不是实际用户的本地时间(除非他们与服务器位于同一时区)。我想这对您来说有多重要取决于您支持多少时区(1个或多个)以及您的服务器所在的位置。

Randster发布的代码运行良好。但是,它可能需要相应地格式化日期,即yyyy-MM-dd HH:MM:ssI不认为这是正确的。它将
str
视为本地时间,然后将其转换为通用时间(用于保存),对吗?我从
-04:00
时区中得到一个
字符串
,我需要将其转换为通用时区。我不认为这是执行查询的用户(印第安纳州东部时间的我)的时区。