我看起来和看起来似乎无法想出完美的解决方案。因此,由于堆栈溢出是完美的,这将解决我的问题。
我从服务器获得System.String
个日期时间(如果您愿意,可以使用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-23 15:14:40
”,在东部时间(-5)返回“2010-07-23 16:14:40
”。让我知道你的想法。
答案 0 :(得分:1)
您的时间加盖巴西时间的原因是附加到执行查询的用户的时区。 CRM在数据库中存储通用,过滤后的视图根据当前用户生成该字符串。这样,无论何时在CRM中打开记录,您都会得到一个包含时区的日期。
如果您所做的只是保存日期/时间以便稍后检查,我同意将其存储为UTC并进行UTC比较。
请注意,如果您使用的是任何ToLocalTime方法,则表示服务器上的本地时间 而不是实际用户本地时间(除非它们与服务器位于同一时区)。我想这对你来说有多重要取决于你支持多少个时区(1个或多个)以及服务器所在的位置。
答案 1 :(得分:0)
???
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;
}
答案 2 :(得分:0)
我认为您应该使用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)));
答案 3 :(得分:0)
您可以使用
将字符串解析为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。我希望这会有所帮助。
答案 4 :(得分:0)
将它们保存为通用时间:
DateTime t = DateTime.Parse(str);
t.ToUniversalTime(); // save this
然后将保存的时间显示为本地:
DateTime t = DateTime.Parse(str);
t.ToLocalTime(); // show this
始终使用通用时间,将本地视为mvc中的视图。