TimeZoneInfo.ConvertTime适用于美国用户,但不适用于爱尔兰用户

时间:2018-12-05 17:46:25

标签: c# .net winforms timezone

我有一个应用程序,用户可以在其中查询数据库以查找测试结果。当他们双击其中一个结果时,它将打开另一个表单以显示数据。我是在亚利桑那州开发的,数据库测试时间显示了亚利桑那州和爱尔兰用户的亚利桑那州时间。打开的第二种形式的一部分需要访问日志文件,爱尔兰日志文件的问题在于文件名中列出的时间以GMT而不是AZ时间表示。

例如,数据库显示测试时间为12/05/2018 08:31 AM,但是爱尔兰测试的日志文件名称为12/05/2018 15:31。为了在开发时解决此问题,我在测试时间和日志文件时间之间添加了一个更正,如下所示:

 var IRTimeZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
 var IRMetroDateCor = TimeZoneInfo.ConvertTime(testtime, IRTimeZone)

当我运行应用程序时,此方法成功运行-它可以毫无问题地找到日志文件。我只是将其部署到爱尔兰供他们测试,通过一些故障排除,我们发现ConvertTime行没有做任何事情。时间仍然是12/05/2018 8:31 AM。

有什么想法可以在这里但在这里行不通?还有其他处理方式,使其对两个站点都适用?

1 个答案:

答案 0 :(得分:0)

从您在问题注释中提供的信息出发:

  

testtime像这样从datagridview单元中获取:

testtime = Convert.ToDateTime(dataGridViewTestList.Rows[e.RowIndex].Cells[6].Value);

Value的{​​{1}}属性的类型为DataGridViewCell,这意味着它可以是任何东西。在这种情况下,它可能是特定格式的object,或者已经是string。这很大程度上取决于您首先如何填充DateTime

  • 如果单元格值已经是DataGridView,那么DateTime就是将其传递通过。您也可以使用Convert.ToDateTime而不是(DateTime) theValue进行投射。您将得到相同的结果。

    • 结果值的Convert.ToDateTime(theValue)属性将与输入值的属性相同。可以是.KindDateTimeKind.UtcDateTimeKind.Local中的任何一个。
  • 如果单元格值为DateTimeKind.Unspecified,则string使用当前区域性对字符串进行解析。它等同于调用Convert.ToDateTime,除了没有任何其他参数可用于控制解析。

    • 如果输入字符串中有任何时区信息,则结果值的DateTime.Parse(theValue)属性将是.Kind,否则将是DateTimeKind.Local。它不能是DateTimeKind.Unspecified,是从DateTimeKind.Utc中出来的。

如您所见,根据获取Convert.ToDateTime值的方式,其DateTime属性可能有所不同。这很重要,因为它可以控制.Kind的行为,如in the documentation所述(滚动到“备注”部分)。

重要的是,请注意,如果TimeZoneInfo.ConvertTimeKind,则将其与Unspecified一样对待。因此,在您的情况下可能发生的情况是,转换始终是从本地时间(无论是哪种时间)到爱尔兰时间。因此,对于爱尔兰用户而言,它似乎根本没有变化。

如果要从亚利桑那时间一直转换为爱尔兰时间 ,则需要指定两个时区,并且需要确保输入Local始终为{{ 1}}。

Kind