【发布时间】:2019-11-12 11:57:51
【问题描述】:
我正在尝试将 DateTime 从源时区转换为 UTC。日期、时间和时区作为用户的输入(显示为下拉菜单选项)。
以下是用于转换的部分代码:
string inputDateString = "2019-11-12T09:00:00.000"; //Taken as input from user
string inputTimeZoneString = "(UTC-03:00) Brasilia"; // Taken as input from user
DateTime dtStartdatetime = DateTime.Parse(inputDateString);
string sourceTimeZone = string.Empty;
foreach (TimeZoneInfo a in TimeZoneInfo.GetSystemTimeZones())
{
if (a.DisplayName == objCalendar.timezone)
{
sourceTimeZone = a.Id;
}
string strTimeZone = a.DisplayName.Substring(a.DisplayName.IndexOf(')') + 1);
string strTimeZone1 = objCalendar.timezone.Substring(objCalendar.timezone.IndexOf(')') + 1);
if (strTimeZone.Trim() == strTimeZone1.Trim())
{
sourceTimeZone = a.Id;
}
}
DateTime utc_time_start = TimeZoneInfo.ConvertTimeToUtc(dtStartdatetime, TimeZoneInfo.FindSystemTimeZoneById(sourceTimeZone));
Console.WriteLine(utc_time_start.ToString("yyyyMMddTHHmmssZ"));
问题是这段代码在开发系统(基于 IST 时区)上运行时将 20191112T120000Z 作为输出,而相同的代码在运行时会产生 20191112T110000Z 作为输出在服务器上(基于 EST)。这种行为是由于运行它的系统的时区不同造成的吗?对于这种情况,可能的解决方案是什么?来自特定时区的特定时间应产生相同的 UTC 时间,而与代码执行的机器无关。
【问题讨论】:
-
首先,在 DateTime.Parse 中,您可以在此字符串中指定您可以预期的时区。如果你没有指定这个 - 它将使用本地机器时区并相应地转换
-
要使用时区,最好使用 DateTimeOffset,因为它有更多使用时区的方法
-
@MichaelKokorin 我不确定说“您可以在解析时指定时区”是否准确 - 您可以指定 偏移量,但这与时区
-
请记住,默认情况下,大多数服务器都以 UTC 运行。 IMO 您应该假设服务器以 UTC 运行,并针对它进行编码。在解析和显示时始终指定时区是解决问题的合理方法。
-
@neil 就我而言,服务器位于东部时间(东部时间),我需要能够将任何时区的时间转换为 UTC。我怎样才能做到这一点?如果您可以分享一些代码,将会有所帮助。