我有一个应用程序,用户可以在其中查询数据库以查找测试结果。当他们双击其中一个结果时,它将打开另一个表单以显示数据。我是在亚利桑那州开发的,数据库测试时间显示了亚利桑那州和爱尔兰用户的亚利桑那州时间。打开的第二种形式的一部分需要访问日志文件,爱尔兰日志文件的问题在于文件名中列出的时间以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。
有什么想法可以在这里但在这里行不通?还有其他处理方式,使其对两个站点都适用?
答案 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)
属性将与输入值的属性相同。可以是.Kind
,DateTimeKind.Utc
或DateTimeKind.Local
中的任何一个。如果单元格值为DateTimeKind.Unspecified
,则string
使用当前区域性对字符串进行解析。它等同于调用Convert.ToDateTime
,除了没有任何其他参数可用于控制解析。
DateTime.Parse(theValue)
属性将是.Kind
,否则将是DateTimeKind.Local
。它不能是DateTimeKind.Unspecified
,是从DateTimeKind.Utc
中出来的。如您所见,根据获取Convert.ToDateTime
值的方式,其DateTime
属性可能有所不同。这很重要,因为它可以控制.Kind
的行为,如in the documentation所述(滚动到“备注”部分)。
重要的是,请注意,如果TimeZoneInfo.ConvertTime
是Kind
,则将其与Unspecified
一样对待。因此,在您的情况下可能发生的情况是,转换始终是从本地时间(无论是哪种时间)到爱尔兰时间。因此,对于爱尔兰用户而言,它似乎根本没有变化。
如果要从亚利桑那时间一直转换为爱尔兰时间 ,则需要指定两个时区,并且需要确保输入Local
始终为{{ 1}}。
Kind