【问题标题】:C# read timezone from string and convert to localC# 从字符串中读取时区并转换为本地时区
【发布时间】:2010-07-30 21:40:55
【问题描述】:

我看了又看,似乎无法想出完美的解决方案。所以,由于堆栈溢出是完美的,这将解决我的问题。

我从服务器(如果您愿意,可以使用 Microsoft CRM)获取 System.String 日期时间。它们采用 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-23 15:14:40”,在东部时间 (-5) 中返回“2010-07-23 16:14:40”。让我知道你的想法。

【问题讨论】:

    标签: c# timezone dynamics-crm


    【解决方案1】:

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

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

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

    【讨论】:

    • 我不认为那是附加到执行查询的用户的时区(我在东部时间,在印第安纳州)。
    【解决方案2】:

    ???

     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;
        }
    

    【讨论】:

      【解决方案3】:

      我认为您应该使用 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)));
      

      【讨论】:

        【解决方案4】:

        您可以使用将字符串解析为 DateTime 对象

        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-24 02:44:40

        我在 IST。我希望这会有所帮助。

        【讨论】:

        • Randster 发布的代码运行良好。但是,它可能需要相应地格式化日期,即 yyyy-MM-dd HH:mm:ss
        【解决方案5】:

        将它们保存为世界时:

           DateTime t = DateTime.Parse(str);
           t.ToUniversalTime(); // save this
        

        然后将保存的时间显示为本地:

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

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

        【讨论】:

        • 我认为这是不对的。将str 视为当地时间,然后将其转换为通用时间(用于保存),对吗?我从-04:00 时区得到string,我需要将其转换为通用。
        猜你喜欢
        • 2011-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-17
        • 1970-01-01
        • 2018-05-25
        • 2020-09-28
        相关资源
        最近更新 更多