C# 当分配给日期字段时,为什么.net将此日期解释为前一天?

C# 当分配给日期字段时,为什么.net将此日期解释为前一天?,c#,.net,vb.net,datetime,C#,.net,Vb.net,Datetime,我有一个从API中读取的日期,格式如下: 2010-03-15T00:00:00-04:00 在C#/VB.net中指定给日期数据类型时,它显示为: 3/14/2010 11:00:00 PM //Note 3/15 is being displayed as 3/14 为什么显示为前一天?上面的格式有名称吗?您显示的日期是,而当您进行转换时,它调整了本地时区的DateTime实例 您应该能够调用以UTC格式获取日期 如果需要为本地时区输入文字形式的时间,则需要使用日期数据(年、月、日等)创

我有一个从API中读取的日期,格式如下:

2010-03-15T00:00:00-04:00
在C#/VB.net中指定给日期数据类型时,它显示为:

3/14/2010 11:00:00 PM //Note 3/15 is being displayed as 3/14

为什么显示为前一天?上面的格式有名称吗?

您显示的日期是,而当您进行转换时,它调整了本地时区的DateTime实例

您应该能够调用以UTC格式获取日期


如果需要为本地时区输入文字形式的时间,则需要使用日期数据(年、月、日等)创建新的DateTime实例或者通过对的一系列调用来指示DateTime实例是本地时区还是UTC。

显示的日期为,而在进行转换时,它调整了本地时区的DateTime实例

您应该能够调用以UTC格式获取日期


如果需要将时间作为本地时区的文字输入,则需要使用日期数据(年、月、日等)或通过对的一系列调用来创建新的DateTime实例,以指示DateTime实例是本地时区还是UTC。

这是时区问题。如果您使用的是.NET3.5,则可以使用该类处理时区,这可能会有所帮助。在以前的.NET版本中,您将不得不使用不那么健壮的时区。

这是一个时区问题。如果您使用的是.NET3.5,则可以使用该类处理时区,这可能会有所帮助。在以前的.NET版本中,您将不得不使用不那么健壮的时区。

这里有几个问题:

1) 请务必注意,原始字符串包含-04:00的时区偏移,因此它不是UTC格式。同一时间点的UTC版本显然是2010-03-15T04:00:00Z(结束Z表示UTC/Zulu)。然后,当您显示日期时间时,它会显示本地时区版本-因为您的本地时区是EST(-5),那么它会在原始字符串(偏移量@-4)中出现的时间之前1小时显示,因此是11:00pm

2) 听起来您的目标不是显示本地时区或UTC版本的时间戳,而是将其保持在输入字符串指定的相同偏移量。幸运的是,3.5为这种场景添加了一种类型:DateTimeOffset

如果要使用DateTimeOffset而不是DateTime,则默认的ToString输出将是:

[342] C:\ » $dto = [datetimeoffset]::parse('2010-03-15T00:00:00-08:00')
[343] C:\ » $dto.ToString()
3/15/2010 12:00:00 AM -08:00
[344] C:\ » $dto.DateTime.ToString()
3/15/2010 12:00:00 AM
请注意,它保留了偏移量的相同时间和知识(因此类型的名称)。如果您不关心偏移量,只想获取输入所处偏移量的DateTime,那么只需获取DateTime属性(如上所示)。如果您需要坚持使用DateTime,并且不能或不想切换到DateTimeOffset,这可能是一种方法。

这里有几个问题:

1) 请务必注意,原始字符串包含-04:00的时区偏移,因此它不是UTC格式。同一时间点的UTC版本显然是2010-03-15T04:00:00Z(结束Z表示UTC/Zulu)。然后,当您显示日期时间时,它会显示本地时区版本-因为您的本地时区是EST(-5),那么它会在原始字符串(偏移量@-4)中出现的时间之前1小时显示,因此是11:00pm

2) 听起来您的目标不是显示本地时区或UTC版本的时间戳,而是将其保持在输入字符串指定的相同偏移量。幸运的是,3.5为这种场景添加了一种类型:DateTimeOffset

如果要使用DateTimeOffset而不是DateTime,则默认的ToString输出将是:

[342] C:\ » $dto = [datetimeoffset]::parse('2010-03-15T00:00:00-08:00')
[343] C:\ » $dto.ToString()
3/15/2010 12:00:00 AM -08:00
[344] C:\ » $dto.DateTime.ToString()
3/15/2010 12:00:00 AM

请注意,它保留了偏移量的相同时间和知识(因此类型的名称)。如果您不关心偏移量,只想获取输入所处偏移量的DateTime,那么只需获取DateTime属性(如上所示)。如果您需要坚持使用DateTime,并且不能或不想切换到DateTimeOffset,这可能是最好的选择。

除非我遗漏了什么,如果只是时区问题,时间应该是8:00:00 PMAh,非常好。我也这么怀疑,但这让我措手不及,因为它在未经我要求的情况下进行转换。@Randolpho:8:00PM假设当地时间比UTC晚4小时。在这种情况下,东欧某个地方的本地时间似乎是UTC+3。@Randolpho:这是假设当前时区是(当前)-8 UTC(由于夏令时,该值可能会有所不同)。好的,我认为我根本没有得到本地时间。我认为这是一个时间戳,看起来是UTC,但实际上是EST,这就是我需要的。所以我只需要指定这是一个时间戳,我想按原样使用。如何在没有.net操作的情况下将其分配给日期数据类型?除非我遗漏了什么,如果只是时区问题,时间应该是PMAh的8:00:00,太好了。我也这么怀疑,但这让我措手不及,因为它在未经我要求的情况下进行转换。@Randolpho:8:00PM假设当地时间比UTC晚4小时。在这种情况下,东欧某个地方的本地时间似乎是UTC+3。@Randolpho:这是假设当前时区是(当前)-8 UTC(由于夏令时,该值可能会有所不同)。好的,我认为我根本没有得到本地时间。我认为这是一个时间戳,看起来是UTC,但实际上是EST,这就是我需要的。所以我只需要指定这是一个时间戳,我想按原样使用。如何简单地将其分配给日期数据类型,而不用.net对其进行操作?